TODO: admin api

pull/21/head
zijiren233 1 year ago
parent e697e09050
commit 79c05699a2

@ -21,7 +21,7 @@ func GetRoomUserRelation(roomID, userID uint) (*model.RoomUserRelation, error) {
return roomUserRelation, err
}
func CreateRoomUserRelation(roomID, userID uint, role model.Role, permissions model.Permission) (*model.RoomUserRelation, error) {
func CreateRoomUserRelation(roomID, userID uint, role model.RoomRole, permissions model.Permission) (*model.RoomUserRelation, error) {
roomUserRelation := &model.RoomUserRelation{
RoomID: roomID,
UserID: userID,
@ -32,7 +32,7 @@ func CreateRoomUserRelation(roomID, userID uint, role model.Role, permissions mo
return roomUserRelation, err
}
func SetUserRole(roomID uint, userID uint, role model.Role) error {
func SetUserRole(roomID uint, userID uint, role model.RoomRole) error {
err := db.Model(&model.RoomUserRelation{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("role", role).Error
if err != nil && errors.Is(err, gorm.ErrRecordNotFound) {
return errors.New("room or user not found")

@ -10,10 +10,22 @@ import (
"gorm.io/gorm/clause"
)
func CreateUser(username string, hashedPassword []byte) (*model.User, error) {
type CreateUserConfig func(u *model.User)
func WithRole(role model.Role) CreateUserConfig {
return func(u *model.User) {
u.Role = role
}
}
func CreateUser(username string, hashedPassword []byte, conf ...CreateUserConfig) (*model.User, error) {
u := &model.User{
Username: username,
HashedPassword: hashedPassword,
Role: model.RoleUser,
}
for _, c := range conf {
c(u)
}
err := db.Create(u).Error
if err != nil && errors.Is(err, gorm.ErrDuplicatedKey) {
@ -22,7 +34,7 @@ func CreateUser(username string, hashedPassword []byte) (*model.User, error) {
return u, err
}
func AddUserToRoom(userID uint, roomID uint, role model.Role, permission model.Permission) error {
func AddUserToRoom(userID uint, roomID uint, role model.RoomRole, permission model.Permission) error {
ur := &model.RoomUserRelation{
UserID: userID,
RoomID: roomID,

@ -2,12 +2,11 @@ package model
import "gorm.io/gorm"
type Role uint32
type RoomRole uint32
const (
RoomRoleBanned Role = iota + 1
RoomRoleBanned RoomRole = iota + 1
RoomRoleUser
RoomRoleAdmin
RoomRoleCreator
)
@ -40,9 +39,9 @@ func (p Permission) Has(permission Permission) bool {
type RoomUserRelation struct {
gorm.Model
UserID uint `gorm:"not null;uniqueIndex:idx_user_room"`
RoomID uint `gorm:"not null;uniqueIndex:idx_user_room"`
Role Role `gorm:"not null"`
UserID uint `gorm:"not null;uniqueIndex:idx_user_room"`
RoomID uint `gorm:"not null;uniqueIndex:idx_user_room"`
Role RoomRole `gorm:"not null"`
Permissions Permission
}
@ -50,8 +49,6 @@ func (r *RoomUserRelation) HasPermission(permission Permission) bool {
switch r.Role {
case RoomRoleCreator:
return true
case RoomRoleAdmin:
return r.Permissions.Has(permission)
case RoomRoleUser:
return r.Permissions.Has(permission)
default:

@ -6,9 +6,18 @@ import (
"gorm.io/gorm"
)
type Role uint8
const (
RoleBanned Role = iota
RoleUser
RoleAdmin
)
type User struct {
gorm.Model
Username string `gorm:"not null;uniqueIndex"`
Role Role `gorm:"not null"`
HashedPassword []byte
GroupUserRelations []RoomUserRelation `gorm:"foreignKey:UserID;constraint:OnUpdate:CASCADE,OnDelete:CASCADE"`
Movies []Movie `gorm:"foreignKey:CreatorID;constraint:OnUpdate:CASCADE,OnDelete:SET NULL"`

@ -305,7 +305,7 @@ func (r *Room) SetPassword(password string) error {
return db.SetRoomHashedPassword(r.ID, hashedPassword)
}
func (r *Room) SetUserRole(userID uint, role model.Role) error {
func (r *Room) SetUserRole(userID uint, role model.RoomRole) error {
return db.SetUserRole(r.ID, userID, role)
}
@ -321,6 +321,10 @@ func (r *Room) RemoveUserPermission(userID uint, permission model.Permission) er
return db.RemoveUserPermission(r.ID, userID, permission)
}
func (r *Room) DeleteUserPermission(userID uint) error {
return db.DeleteUserPermission(r.ID, userID)
}
func (r *Room) GetMoviesCount() (int, error) {
return GetMoviesCountByRoomID(r.ID)
}

@ -50,7 +50,7 @@ func GetUserByUsername(username string) (*User, error) {
var ErrInvalidUsernameOrPassword = bcrypt.ErrMismatchedHashAndPassword
func CreateUser(username, password string) (*User, error) {
func CreateUser(username, password string, conf ...db.CreateUserConfig) (*User, error) {
if username == "" || password == "" {
return nil, ErrInvalidUsernameOrPassword
}
@ -58,7 +58,7 @@ func CreateUser(username, password string) (*User, error) {
if err != nil {
return nil, err
}
u, err := db.CreateUser(username, hashedPassword)
u, err := db.CreateUser(username, hashedPassword, conf...)
if err != nil {
return nil, err
}

@ -40,6 +40,11 @@ func Init(e *gin.Engine) {
public.GET("/settings", Settings)
}
{
// TODO: admin api implement
// admin := api.Group("/admin")
}
{
room := api.Group("/room")
needAuthRoom := needAuthRoomApi.Group("/room")
@ -59,10 +64,6 @@ func Init(e *gin.Engine) {
needAuthRoom.POST("/pwd", SetRoomPassword)
needAuthRoom.PUT("/admin", AddAdmin)
needAuthRoom.DELETE("/admin", DelAdmin)
needAuthRoom.GET("/setting", RoomSetting)
}

@ -229,54 +229,6 @@ func SetRoomPassword(ctx *gin.Context) {
}))
}
func AddAdmin(ctx *gin.Context) {
room := ctx.MustGet("room").(*op.Room)
user := ctx.MustGet("user").(*op.User)
if !user.HasPermission(room, dbModel.CanSetAdmin) {
ctx.AbortWithStatusJSON(http.StatusUnauthorized, model.NewApiErrorStringResp("you don't have permission to add admin"))
return
}
req := model.UserIdReq{}
if err := model.Decode(ctx, &req); err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return
}
err := room.SetUserRole(req.UserId, dbModel.RoomRoleAdmin)
if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
return
}
ctx.Status(http.StatusNoContent)
}
func DelAdmin(ctx *gin.Context) {
room := ctx.MustGet("room").(*op.Room)
user := ctx.MustGet("user").(*op.User)
if !user.HasPermission(room, dbModel.CanSetAdmin) {
ctx.AbortWithStatusJSON(http.StatusUnauthorized, model.NewApiErrorStringResp("you don't have permission to del admin"))
return
}
req := model.UserIdReq{}
if err := model.Decode(ctx, &req); err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return
}
err := room.SetUserRole(req.UserId, dbModel.RoomRoleUser)
if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
return
}
ctx.Status(http.StatusNoContent)
}
func RoomSetting(ctx *gin.Context) {
room := ctx.MustGet("room").(*op.Room)
// user := ctx.MustGet("user").(*op.User)

Loading…
Cancel
Save