|
|
|
package db
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
|
|
|
"github.com/synctv-org/synctv/internal/model"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
)
|
|
|
|
|
|
|
|
type CreateRoomMemberRelationConfig func(r *model.RoomMember)
|
|
|
|
|
|
|
|
func WithRoomMemberStatus(status model.RoomMemberStatus) CreateRoomMemberRelationConfig {
|
|
|
|
return func(r *model.RoomMember) {
|
|
|
|
r.Status = status
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func WithRoomMemberRole(role model.RoomMemberRole) CreateRoomMemberRelationConfig {
|
|
|
|
return func(r *model.RoomMember) {
|
|
|
|
r.Role = role
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func WithRoomMemberPermissions(permissions model.RoomMemberPermission) CreateRoomMemberRelationConfig {
|
|
|
|
return func(r *model.RoomMember) {
|
|
|
|
r.Permissions = permissions
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func WithRoomMemberAdminPermissions(permissions model.RoomAdminPermission) CreateRoomMemberRelationConfig {
|
|
|
|
return func(r *model.RoomMember) {
|
|
|
|
r.AdminPermissions = permissions
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func FirstOrCreateRoomMemberRelation(roomID, userID string, conf ...CreateRoomMemberRelationConfig) (*model.RoomMember, error) {
|
|
|
|
roomMemberRelation := &model.RoomMember{}
|
|
|
|
d := &model.RoomMember{
|
|
|
|
RoomID: roomID,
|
|
|
|
UserID: userID,
|
|
|
|
Role: model.RoomMemberRoleMember,
|
|
|
|
Status: model.RoomMemberStatusPending,
|
|
|
|
Permissions: model.NoPermission,
|
|
|
|
AdminPermissions: model.NoAdminPermission,
|
|
|
|
}
|
|
|
|
for _, c := range conf {
|
|
|
|
c(d)
|
|
|
|
}
|
|
|
|
err := db.Where("room_id = ? AND user_id = ?", roomID, userID).Attrs(d).FirstOrCreate(roomMemberRelation).Error
|
|
|
|
return roomMemberRelation, err
|
|
|
|
}
|
|
|
|
|
|
|
|
func GetRoomMember(roomID, userID string) (*model.RoomMember, error) {
|
|
|
|
roomMemberRelation := &model.RoomMember{}
|
|
|
|
err := db.Where("room_id = ? AND user_id = ?", roomID, userID).First(roomMemberRelation).Error
|
|
|
|
return roomMemberRelation, HandleNotFound(err, "room or user")
|
|
|
|
}
|
|
|
|
|
|
|
|
func RoomApprovePendingMember(roomID, userID string) error {
|
|
|
|
roomMember := &model.RoomMember{}
|
|
|
|
err := db.Where("room_id = ? AND user_id = ?", roomID, userID).First(roomMember).Error
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
if roomMember.Status != model.RoomMemberStatusPending {
|
|
|
|
return fmt.Errorf("user is not pending")
|
|
|
|
}
|
|
|
|
err = db.Model(&model.RoomMember{}).
|
|
|
|
Where("room_id = ? AND user_id = ? AND status = ?", roomID, userID, model.RoomMemberStatusPending).
|
|
|
|
Update("status", model.RoomMemberStatusActive).
|
|
|
|
Error
|
|
|
|
if err != nil && gorm.ErrRecordNotFound != err {
|
|
|
|
return fmt.Errorf("update status failed")
|
|
|
|
}
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func RoomBanMember(roomID, userID string) error {
|
|
|
|
err := db.Model(&model.RoomMember{}).
|
|
|
|
Where("room_id = ? AND user_id = ?", roomID, userID).
|
|
|
|
Update("status", model.RoomMemberStatusBanned).
|
|
|
|
Error
|
|
|
|
return HandleNotFound(err, "room or user")
|
|
|
|
}
|
|
|
|
|
|
|
|
func RoomUnbanMember(roomID, userID string) error {
|
|
|
|
err := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("status", model.RoomMemberStatusActive).Error
|
|
|
|
return HandleNotFound(err, "room or user")
|
|
|
|
}
|
|
|
|
|
|
|
|
func SetMemberPermissions(roomID string, userID string, permission model.RoomMemberPermission) error {
|
|
|
|
err := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("permissions", permission).Error
|
|
|
|
return HandleNotFound(err, "room or user")
|
|
|
|
}
|
|
|
|
|
|
|
|
func AddMemberPermissions(roomID string, userID string, permission model.RoomMemberPermission) error {
|
|
|
|
err := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("permissions", db.Raw("permissions | ?", permission)).Error
|
|
|
|
return HandleNotFound(err, "room or user")
|
|
|
|
}
|
|
|
|
|
|
|
|
func RemoveMemberPermissions(roomID string, userID string, permission model.RoomMemberPermission) error {
|
|
|
|
err := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("permissions", db.Raw("permissions & ?", ^permission)).Error
|
|
|
|
return HandleNotFound(err, "room or user")
|
|
|
|
}
|
|
|
|
|
|
|
|
// func GetAllRoomMembersRelationCount(roomID string, scopes ...func(*gorm.DB) *gorm.DB) (int64, error) {
|
|
|
|
// var count int64
|
|
|
|
// err := db.Model(&model.RoomMember{}).Where("room_id = ?", roomID).Scopes(scopes...).Count(&count).Error
|
|
|
|
// return count, err
|
|
|
|
// }
|
|
|
|
|
|
|
|
func RoomSetAdminPermissions(roomID, userID string, permissions model.RoomAdminPermission) error {
|
|
|
|
err := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("admin_permissions", permissions).Error
|
|
|
|
return HandleNotFound(err, "room or user")
|
|
|
|
}
|
|
|
|
|
|
|
|
func RoomAddAdminPermissions(roomID, userID string, permissions model.RoomAdminPermission) error {
|
|
|
|
err := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("admin_permissions", db.Raw("admin_permissions | ?", permissions)).Error
|
|
|
|
return HandleNotFound(err, "room or user")
|
|
|
|
}
|
|
|
|
|
|
|
|
func RoomRemoveAdminPermissions(roomID, userID string, permissions model.RoomAdminPermission) error {
|
|
|
|
err := db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Update("admin_permissions", db.Raw("admin_permissions & ?", ^permissions)).Error
|
|
|
|
return HandleNotFound(err, "room or user")
|
|
|
|
}
|
|
|
|
|
|
|
|
func RoomSetAdmin(roomID, userID string, permissions model.RoomAdminPermission) error {
|
|
|
|
return db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Updates(map[string]interface{}{
|
|
|
|
"role": model.RoomMemberRoleAdmin,
|
|
|
|
"permissions": model.AllPermissions,
|
|
|
|
"admin_permissions": permissions,
|
|
|
|
}).Error
|
|
|
|
}
|
|
|
|
|
|
|
|
func RoomSetMember(roomID, userID string, permissions model.RoomMemberPermission) error {
|
|
|
|
return db.Model(&model.RoomMember{}).Where("room_id = ? AND user_id = ?", roomID, userID).Updates(map[string]interface{}{
|
|
|
|
"role": model.RoomMemberRoleMember,
|
|
|
|
"permissions": permissions,
|
|
|
|
"admin_permissions": model.NoAdminPermission,
|
|
|
|
}).Error
|
|
|
|
}
|