diff --git a/internal/casbin/casbin.go b/internal/casbin/casbin.go index fabf43d7..18182723 100644 --- a/internal/casbin/casbin.go +++ b/internal/casbin/casbin.go @@ -14,13 +14,18 @@ var ( ) func InitCasbin() { - adapter, err := gormadapter.NewAdapterByDB(database.Db()) + adapter, err := gormadapter.NewAdapterByDBWithCustomTable( + database.Db(), + &gormadapter.CasbinRule{}, + "casbins", + ) cfg, err := embed.FS.ReadFile("configs/casbin.conf") md, _ := model.NewModelFromString(string(cfg)) Enforcer, err = casbin.NewEnforcer(md, adapter) if err != nil { zap.L().Fatal("Casbin init failed", zap.Error(err)) } - _ = Enforcer.LoadPolicy() + Enforcer.ClearPolicy() + _ = Enforcer.SavePolicy() initDefaultPolicy() } diff --git a/internal/casbin/policy.go b/internal/casbin/policy.go index 34bde1a4..4eaeeabd 100644 --- a/internal/casbin/policy.go +++ b/internal/casbin/policy.go @@ -9,12 +9,6 @@ func initDefaultPolicy() { {"admin", "/api/*", "PUT"}, {"admin", "/api/*", "DELETE"}, - {"monitor", "/api/games", "POST"}, - {"monitor", "/api/games/{id}", "PUT"}, - {"monitor", "/api/games/{id}", "DELETE"}, - {"monitor", "/api/games/{id}/challenges", "POST"}, - {"monitor", "/api/games/{id}/teams/{team_id}", "PUT"}, - {"user", "/api/", "GET"}, {"user", "/api/users/logout", "POST"}, {"user", "/api/users/{id}", "PUT"}, @@ -40,7 +34,6 @@ func initDefaultPolicy() { {"guest", "/api/", "GET"}, {"guest", "/api/configs/", "GET"}, {"guest", "/api/users/", "GET"}, - {"guest", "/api/users/token/{token}", "GET"}, {"guest", "/api/users/register", "POST"}, {"guest", "/api/users/login", "POST"}, {"guest", "/api/games/{id}/broadcast", "GET"}, @@ -51,8 +44,7 @@ func initDefaultPolicy() { _, err = Enforcer.AddGroupingPolicies([][]string{ {"user", "guest"}, - {"monitor", "user"}, - {"admin", "monitor"}, + {"admin", "user"}, }) if err != nil { diff --git a/internal/controller/game.go b/internal/controller/game.go index 7b455446..808ebf34 100644 --- a/internal/controller/game.go +++ b/internal/controller/game.go @@ -60,7 +60,7 @@ func NewGameController(appService *service.Service) IGameController { // @Tags Game // @Router /games/{id}/broadcast [get] func (g *GameController) BroadCast(ctx *gin.Context) { - id := convertor.ToInt64D(ctx.Param("id"), 0) + id := convertor.ToUintD(ctx.Param("id"), 0) if id != 0 { hub.ServeGameHub(ctx.Writer, ctx.Request, id) } diff --git a/internal/database/group.go b/internal/database/group.go index 1007b736..737b9f87 100644 --- a/internal/database/group.go +++ b/internal/database/group.go @@ -16,11 +16,6 @@ func initGroup() { DisplayName: "Administrator", Description: "The administrator has the highest authority.", }, - { - Name: "monitor", - DisplayName: "Monitor", - Description: "The monitor has the authority to control the games.", - }, { Name: "user", DisplayName: "User", diff --git a/internal/hub/game.go b/internal/hub/game.go index 2a2beb0c..8d8570e3 100644 --- a/internal/hub/game.go +++ b/internal/hub/game.go @@ -14,10 +14,10 @@ type GameHub struct { M sync.RWMutex } -var gameHubs = make(map[int64]*GameHub) +var gameHubs = make(map[uint]*GameHub) var gameHubsLock sync.Mutex -func ServeGameHub(w http.ResponseWriter, r *http.Request, gameID int64) { +func ServeGameHub(w http.ResponseWriter, r *http.Request, gameID uint) { gameHubsLock.Lock() gameHub, ok := gameHubs[gameID] if !ok { @@ -72,7 +72,7 @@ func handleGameHub(gameHub *GameHub) { } } -func SendGameMsg(gameID int64, msg interface{}) { +func SendGameMsg(gameID uint, msg interface{}) { gameHubsLock.Lock() gameHub, ok := gameHubs[gameID] gameHubsLock.Unlock() diff --git a/internal/model/game.go b/internal/model/game.go index 252cdfa4..9954991d 100644 --- a/internal/model/game.go +++ b/internal/model/game.go @@ -30,5 +30,7 @@ type Game struct { func (g *Game) BeforeDelete(db *gorm.DB) (err error) { db.Table("game_teams").Where("game_id = ?", g.ID).Delete(&GameTeam{}) db.Table("game_challenges").Where("game_id = ?", g.ID).Delete(&GameChallenge{}) + db.Table("submissions").Where("game_id = ?", g.ID).Delete(&Submission{}) + db.Table("notices").Where("game_id = ?", g.ID).Delete(&Notice{}) return nil } diff --git a/internal/model/game_challenge.go b/internal/model/game_challenge.go index c8ca46fa..b495ee65 100644 --- a/internal/model/game_challenge.go +++ b/internal/model/game_challenge.go @@ -15,5 +15,6 @@ type GameChallenge struct { func (g *GameChallenge) BeforeDelete(db *gorm.DB) (err error) { db.Table("submissions").Where("game_id = ?", g.GameID).Where("challenge_id = ?", g.ChallengeID).Delete(&Submission{}) + db.Table("notices").Where("game_id = ?", g.GameID).Where("challenge_id = ?", g.ChallengeID).Delete(&Notice{}) return nil } diff --git a/internal/model/notice.go b/internal/model/notice.go index ee6ffe96..76800785 100644 --- a/internal/model/notice.go +++ b/internal/model/notice.go @@ -1,5 +1,10 @@ package model +import ( + "github.com/elabosak233/cloudsdale/internal/hub" + "gorm.io/gorm" +) + type Notice struct { ID uint `json:"id"` // The game event's id. Type string `gorm:"type:varchar(16);not null;default:'notice'" json:"type,omitempty"` // The game event's type. (Such as "first_blood", "second_blood", "third_blood", "new_challenge", "new_hint", "normal") @@ -15,3 +20,19 @@ type Notice struct { CreatedAt int64 `gorm:"autoUpdateTime:milli" json:"created_at,omitempty"` // The game event's creation time. UpdatedAt int64 `gorm:"autoUpdateTime:milli" json:"updated_at,omitempty"` // The game event's last update time. } + +func (n *Notice) AfterCreate(db *gorm.DB) (err error) { + result := db.Table("notices"). + Preload("User", func(db *gorm.DB) *gorm.DB { + return db.Select([]string{"id", "username", "nickname", "email"}) + }). + Preload("Team", func(db *gorm.DB) *gorm.DB { + return db.Select([]string{"id", "name", "email"}) + }). + Preload("Challenge", func(db *gorm.DB) *gorm.DB { + return db.Select([]string{"id", "title"}) + }). + First(n, n.ID) + hub.SendGameMsg(*(n.GameID), n) + return result.Error +} diff --git a/internal/model/response/category_response.go b/internal/model/response/category_response.go deleted file mode 100644 index cfb9cb1a..00000000 --- a/internal/model/response/category_response.go +++ /dev/null @@ -1,9 +0,0 @@ -package response - -type CategorySimpleResponse struct { - ID int64 `xorm:"'id'" json:"id"` - Name string `xorm:"'name'" json:"name"` - Description string `xorm:"'description'" json:"description"` - ColorHex string `xorm:"'color_hex'" json:"color_hex"` - Mdi string `xorm:"'mdi'" json:"mdi"` -} diff --git a/internal/model/response/challenge_response.go b/internal/model/response/challenge_response.go deleted file mode 100644 index e96a635a..00000000 --- a/internal/model/response/challenge_response.go +++ /dev/null @@ -1,34 +0,0 @@ -package response - -import ( - "github.com/elabosak233/cloudsdale/internal/model" -) - -type ChallengeResponse struct { - ID uint `json:"id"` - Title string `gorm:"type:varchar(32);not null;" json:"title"` - Description string `gorm:"type:text;not null;" json:"description"` - CategoryID uint `gorm:"not null;" json:"category_id"` - Category *model.Category `json:"category,omitempty"` - HasAttachment *bool `gorm:"not null;default:false" json:"has_attachment"` - AttachmentURL string `gorm:"type:varchar(255);" json:"attachment_url"` - IsPracticable *bool `gorm:"not null;default:false" json:"is_practicable"` - IsDynamic *bool `gorm:"default:false" json:"is_dynamic"` - Difficulty int64 `gorm:"default:1" json:"difficulty"` - PracticePts int64 `gorm:"default:200" json:"practice_pts"` - Duration int64 `gorm:"default:1800" json:"duration,omitempty"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` - Flags []*model.Flag `json:"flags,omitempty"` - Hints []*model.Hint `json:"hints,omitempty"` - Images []*model.Image `json:"images,omitempty"` - Submissions []*model.Submission `json:"submissions,omitempty"` - Solved *model.Submission `json:"solved"` -} - -type ChallengeSimpleResponse struct { - ID int64 `xorm:"'id'" json:"id"` - Title string `xorm:"'title'" json:"title"` - Description string `xorm:"'description'" json:"description"` - Category string `xorm:"'category'" json:"category"` -} diff --git a/internal/model/response/flag_response.go b/internal/model/response/flag_response.go deleted file mode 100644 index c53afc3e..00000000 --- a/internal/model/response/flag_response.go +++ /dev/null @@ -1,8 +0,0 @@ -package response - -type FlagSimpleResponse struct { - ID int64 `xorm:"'id'" json:"id"` - Content string `xorm:"'content'" json:"content"` - Type string `xorm:"'type'" json:"type"` - Env string `xorm:"'env'" json:"env"` -} diff --git a/internal/model/response/game_response.go b/internal/model/response/game_response.go index 6b46f9df..bf72ffe1 100644 --- a/internal/model/response/game_response.go +++ b/internal/model/response/game_response.go @@ -4,15 +4,6 @@ import ( "github.com/elabosak233/cloudsdale/internal/model" ) -type GameResponse struct { - model.Game -} - -type GameSimpleResponse struct { - ID int64 `json:"id"` - Title string `json:"title"` -} - type GameChallengeResponse struct { *model.Challenge IsEnabled bool `json:"is_enabled"` diff --git a/internal/model/response/image_response.go b/internal/model/response/image_response.go deleted file mode 100644 index c1da34a2..00000000 --- a/internal/model/response/image_response.go +++ /dev/null @@ -1,17 +0,0 @@ -package response - -import "github.com/elabosak233/cloudsdale/internal/model" - -type ImageResponse struct { - ImageSimpleResponse - Ports []PortSimpleResponse `xorm:"-" json:"ports"` - Envs []model.Env `xorm:"-" json:"envs"` -} - -type ImageSimpleResponse struct { - ID int64 `xorm:"'id'" json:"id"` - Name string `xorm:"'name'" json:"name"` - Description string `xorm:"'description'" json:"description"` - MemoryLimit int64 `xorm:"'memory_limit'" json:"memory_limit"` - CPULimit float64 `xorm:"'cpu_limit'" json:"cpu_limit"` -} diff --git a/internal/model/response/port_response.go b/internal/model/response/port_response.go deleted file mode 100644 index 483ebf8f..00000000 --- a/internal/model/response/port_response.go +++ /dev/null @@ -1,7 +0,0 @@ -package response - -type PortSimpleResponse struct { - ID int64 `xorm:"'id'" json:"id"` - Value int `xorm:"'value'" json:"value"` - Description string `xorm:"'description'" json:"description"` -} diff --git a/internal/model/response/submission_response.go b/internal/model/response/submission_response.go deleted file mode 100644 index 4e1e686a..00000000 --- a/internal/model/response/submission_response.go +++ /dev/null @@ -1,2 +0,0 @@ -package response - diff --git a/internal/model/response/team_response.go b/internal/model/response/team_response.go deleted file mode 100644 index 9f368109..00000000 --- a/internal/model/response/team_response.go +++ /dev/null @@ -1,27 +0,0 @@ -package response - -import ( - "github.com/elabosak233/cloudsdale/internal/model" -) - -type TeamResponse struct { - ID uint `json:"id"` - Name string `json:"name"` - Description string `json:"description"` - Email string `json:"email"` - CaptainId uint `json:"captain_id"` - IsLocked bool `json:"is_locked"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` - Users []*model.User `json:"users,omitempty"` - Captain model.User `json:"captain,omitempty"` -} - -type TeamSimpleResponse struct { - ID uint `json:"id"` - Name string `json:"name"` - Description string `json:"description"` - Email string `json:"email"` - CaptainId uint `json:"captain_id"` - IsLocked bool `json:"is_locked"` -} diff --git a/internal/model/response/user_response.go b/internal/model/response/user_response.go index 02b55201..3c266b30 100644 --- a/internal/model/response/user_response.go +++ b/internal/model/response/user_response.go @@ -5,19 +5,13 @@ import ( ) type UserResponse struct { - ID uint `json:"id"` - Username string `json:"username"` - Nickname string `json:"nickname"` - Email string `json:"email"` - GroupID uint `json:"group_id"` - Group *model.Group `json:"group"` - CreatedAt int64 `json:"created_at"` - UpdatedAt int64 `json:"updated_at"` - Teams []*TeamSimpleResponse `json:"teams,omitempty"` -} - -type UserSimpleResponse struct { - ID uint `xorm:"'id'" json:"id"` - Username string `xorm:"'username'" json:"username"` - Nickname string `xorm:"'nickname'" json:"nickname"` + ID uint `json:"id"` + Username string `json:"username"` + Nickname string `json:"nickname"` + Email string `json:"email"` + GroupID uint `json:"group_id"` + Group *model.Group `json:"group"` + CreatedAt int64 `json:"created_at"` + UpdatedAt int64 `json:"updated_at"` + Teams []*model.Team `json:"teams,omitempty"` } diff --git a/internal/repository/game.go b/internal/repository/game.go index f4300bf8..716e3f5a 100644 --- a/internal/repository/game.go +++ b/internal/repository/game.go @@ -3,7 +3,6 @@ package repository import ( "github.com/elabosak233/cloudsdale/internal/model" "github.com/elabosak233/cloudsdale/internal/model/request" - "github.com/elabosak233/cloudsdale/internal/model/response" "gorm.io/gorm" ) @@ -11,7 +10,7 @@ type IGameRepository interface { Insert(game model.Game) (g model.Game, err error) Update(game model.Game) (err error) Delete(req request.GameDeleteRequest) (err error) - Find(req request.GameFindRequest) (games []response.GameResponse, count int64, err error) + Find(req request.GameFindRequest) (games []model.Game, count int64, err error) } type GameRepository struct { @@ -39,7 +38,7 @@ func (t *GameRepository) Delete(req request.GameDeleteRequest) (err error) { return result.Error } -func (t *GameRepository) Find(req request.GameFindRequest) (games []response.GameResponse, count int64, err error) { +func (t *GameRepository) Find(req request.GameFindRequest) (games []model.Game, count int64, err error) { applyFilters := func(q *gorm.DB) *gorm.DB { if req.ID != 0 { q = q.Where("id = ?", req.ID) diff --git a/internal/repository/instance.go b/internal/repository/instance.go index 7795e776..29abbb3c 100644 --- a/internal/repository/instance.go +++ b/internal/repository/instance.go @@ -6,8 +6,7 @@ import ( ) type IInstanceRepository interface { - Insert(container model.Instance) (c model.Instance, err error) - FindByPodID(podIDs []uint) (containers []model.Instance, err error) + Insert(instance model.Instance) (i model.Instance, err error) } type InstanceRepository struct { @@ -18,16 +17,7 @@ func NewInstanceRepository(db *gorm.DB) IInstanceRepository { return &InstanceRepository{db: db} } -func (t *InstanceRepository) Insert(container model.Instance) (c model.Instance, err error) { - result := t.db.Table("instances").Create(&container) - return container, result.Error -} - -func (t *InstanceRepository) FindByPodID(podIDs []uint) (containers []model.Instance, err error) { - result := t.db.Table("instances"). - Where("pod_id IN ?", podIDs). - Preload("Image"). - Preload("Nats"). - Find(&containers) - return containers, result.Error +func (t *InstanceRepository) Insert(instance model.Instance) (i model.Instance, err error) { + result := t.db.Table("instances").Create(&instance) + return instance, result.Error } diff --git a/internal/repository/submission.go b/internal/repository/submission.go index 76f3697f..e8d8bb0e 100644 --- a/internal/repository/submission.go +++ b/internal/repository/submission.go @@ -10,7 +10,6 @@ type ISubmissionRepository interface { Insert(submission model.Submission) (err error) Delete(id uint) (err error) Find(req request.SubmissionFindRequest) (submissions []model.Submission, count int64, err error) - FindByChallengeID(req request.SubmissionFindByChallengeIDRequest) (submissions []model.Submission, err error) } type SubmissionRepository struct { @@ -70,46 +69,18 @@ func (t *SubmissionRepository) Find(req request.SubmissionFindRequest) (submissi Preload("User", func(db *gorm.DB) *gorm.DB { return db.Select([]string{"id", "username", "nickname", "email"}) }). - Preload("Challenge"). + Preload("Challenge", func(db *gorm.DB) *gorm.DB { + return db. + Preload("Category"). + Select([]string{"id", "title", "category_id", "difficulty", "practice_pts"}) + }). Preload("GameChallenge"). - Preload("Team"). + Preload("Team", func(db *gorm.DB) *gorm.DB { + return db.Select([]string{"id", "name", "email"}) + }). Preload("Game", func(db *gorm.DB) *gorm.DB { return db.Select([]string{"id", "title", "bio", "first_blood_reward_ratio", "second_blood_reward_ratio", "third_blood_reward_ratio"}) }). Find(&submissions) return submissions, count, result.Error } - -func (t *SubmissionRepository) FindByChallengeID(req request.SubmissionFindByChallengeIDRequest) (submissions []model.Submission, err error) { - applyFilters := func(q *gorm.DB) *gorm.DB { - if req.UserID != 0 { - q = q.Where("submissions.user_id = ?", req.UserID) - } - if req.TeamID != nil { - q = q.Where("submissions.team_id = ?", *(req.TeamID)) - } - if req.GameID != nil { - q = q.Where("submissions.game_id = ?", *(req.GameID)) - } - if req.Status != 0 { - q = q.Where("submissions.status = ?", req.Status) - } - return q - } - db := applyFilters(t.db.Table("submissions")) - if len(req.SortBy) > 0 { - sortKey := req.SortBy[0] - sortOrder := req.SortBy[1] - if sortOrder == "asc" { - db = db.Order("submissions." + sortKey + " ASC") - } else if sortOrder == "desc" { - db = db.Order("submissions." + sortKey + " DESC") - } - } - db = db.Joins("INNER JOIN users ON submissions.user_id = users.id"). - Joins("LEFT JOIN teams ON submissions.team_id = teams.id"). - Joins("LEFT JOIN challenges ON submissions.challenge_id = challenges.id"). - Where("submissions.challenge_id IN ?", req.ChallengeID) - _ = db.Find(&submissions) - return submissions, err -} diff --git a/internal/router/challenge.go b/internal/router/challenge.go index 14c473f4..8e5334dd 100644 --- a/internal/router/challenge.go +++ b/internal/router/challenge.go @@ -42,12 +42,12 @@ func (c *ChallengeRouter) Register() { func (c *ChallengeRouter) SAuth() gin.HandlerFunc { return func(ctx *gin.Context) { user, _ := ctx.Get("user") - if user.(*response.UserResponse).Group.Name == "admin" || user.(*response.UserResponse).Group.Name == "monitor" { + if user.(*response.UserResponse).Group.Name == "admin" { ctx.Set("is_detailed", convertor.ToBoolD(ctx.Query("is_detailed"), false)) } else { ctx.Set("is_detailed", false) } - if user.(*response.UserResponse).Group.Name == "admin" || user.(*response.UserResponse).Group.Name == "monitor" { + if user.(*response.UserResponse).Group.Name == "admin" { ctx.Set("is_practicable", convertor.ToBoolP(ctx.Query("is_practicable"))) } else { ctx.Set("is_practicable", convertor.TrueP()) diff --git a/internal/router/game.go b/internal/router/game.go index caeb112f..8f440094 100644 --- a/internal/router/game.go +++ b/internal/router/game.go @@ -48,7 +48,7 @@ func (g *GameRouter) Register() { func (g *GameRouter) SAuth() gin.HandlerFunc { return func(ctx *gin.Context) { user, _ := ctx.Get("user") - if !(user.(*response.UserResponse).Group.Name == "admin" || user.(*response.UserResponse).Group.Name == "monitor") { + if !(user.(*response.UserResponse).Group.Name == "admin") { ctx.Set("is_enabled", true) } ctx.Next() diff --git a/internal/router/submission.go b/internal/router/submission.go index cd240a57..1112dee0 100644 --- a/internal/router/submission.go +++ b/internal/router/submission.go @@ -33,7 +33,7 @@ func (s *SubmissionRouter) SAuth() gin.HandlerFunc { return func(ctx *gin.Context) { if convertor.ToBoolD(ctx.Query("is_detailed"), false) { user, _ := ctx.Get("user") - if user.(*response.UserResponse).Group.Name == "admin" || user.(*response.UserResponse).Group.Name == "monitor" { + if user.(*response.UserResponse).Group.Name == "admin" { ctx.Set("is_detailed", true) } } else { diff --git a/internal/router/team.go b/internal/router/team.go index b838c735..86a8adb9 100644 --- a/internal/router/team.go +++ b/internal/router/team.go @@ -43,7 +43,7 @@ func (t *TeamRouter) SAuth() gin.HandlerFunc { isCaptain := func() bool { for _, team := range user.Teams { - if team.ID == convertor.ToUintD(ctx.Param("id"), 0) && team.CaptainId == user.ID { + if team.ID == convertor.ToUintD(ctx.Param("id"), 0) && team.CaptainID == user.ID { return true } } diff --git a/internal/service/challenge.go b/internal/service/challenge.go index 4bac03a1..4f2f2e01 100644 --- a/internal/service/challenge.go +++ b/internal/service/challenge.go @@ -3,14 +3,13 @@ package service import ( "github.com/elabosak233/cloudsdale/internal/model" "github.com/elabosak233/cloudsdale/internal/model/request" - "github.com/elabosak233/cloudsdale/internal/model/response" "github.com/elabosak233/cloudsdale/internal/repository" "github.com/mitchellh/mapstructure" "math" ) type IChallengeService interface { - Find(req request.ChallengeFindRequest) (challenges []response.ChallengeResponse, pageCount int64, total int64, err error) + Find(req request.ChallengeFindRequest) (challenges []model.Challenge, pageCount int64, total int64, err error) Create(req request.ChallengeCreateRequest) (err error) Update(req request.ChallengeUpdateRequest) (err error) Delete(id uint) (err error) @@ -60,22 +59,20 @@ func (t *ChallengeService) Delete(id uint) (err error) { return err } -func (t *ChallengeService) Find(req request.ChallengeFindRequest) (challenges []response.ChallengeResponse, pageCount int64, total int64, err error) { - challengesData, count, err := t.challengeRepository.Find(req) +func (t *ChallengeService) Find(req request.ChallengeFindRequest) (challenges []model.Challenge, pageCount int64, total int64, err error) { + challenges, count, err := t.challengeRepository.Find(req) - for _, challenge := range challengesData { - var challengeResponse response.ChallengeResponse - _ = mapstructure.Decode(challenge, &challengeResponse) + for index, challenge := range challenges { if !*(req.IsDetailed) { - challengeResponse.Flags = nil - challengeResponse.Images = nil + challenge.Flags = nil + challenge.Images = nil } if req.SubmissionQty != 0 { - challengeResponse.Submissions = challengeResponse.Submissions[:min(req.SubmissionQty, len(challengeResponse.Submissions))] + challenge.Submissions = challenge.Submissions[:min(req.SubmissionQty, len(challenge.Submissions))] } else { - challengeResponse.Submissions = nil + challenge.Submissions = nil } - challenges = append(challenges, challengeResponse) + challenges[index] = challenge } if req.Size >= 1 && req.Page >= 1 { diff --git a/internal/service/game.go b/internal/service/game.go index cafaf38a..d323a5c3 100644 --- a/internal/service/game.go +++ b/internal/service/game.go @@ -6,14 +6,13 @@ import ( "encoding/base64" "github.com/elabosak233/cloudsdale/internal/model" "github.com/elabosak233/cloudsdale/internal/model/request" - "github.com/elabosak233/cloudsdale/internal/model/response" "github.com/elabosak233/cloudsdale/internal/repository" "github.com/mitchellh/mapstructure" "math" ) type IGameService interface { - Find(req request.GameFindRequest) (games []response.GameResponse, pageCount int64, total int64, err error) + Find(req request.GameFindRequest) (games []model.Game, pageCount int64, total int64, err error) Create(req request.GameCreateRequest) (err error) Update(req request.GameUpdateRequest) (err error) Delete(req request.GameDeleteRequest) (err error) @@ -64,7 +63,7 @@ func (g *GameService) Delete(req request.GameDeleteRequest) (err error) { return g.gameRepository.Delete(req) } -func (g *GameService) Find(req request.GameFindRequest) (games []response.GameResponse, pageCount int64, total int64, err error) { +func (g *GameService) Find(req request.GameFindRequest) (games []model.Game, pageCount int64, total int64, err error) { games, count, err := g.gameRepository.Find(req) if req.Size >= 1 && req.Page >= 1 { pageCount = int64(math.Ceil(float64(count) / float64(req.Size))) diff --git a/internal/service/game_team.go b/internal/service/game_team.go index 321384aa..2c4d5e32 100644 --- a/internal/service/game_team.go +++ b/internal/service/game_team.go @@ -52,7 +52,7 @@ func (g *GameTeamService) Find(req request.GameTeamFindRequest) (teams []respons gameTeams[i].Pts = 0 gameTeams[i].Solved = 0 for _, submission := range submissions { - if submission.TeamID != nil && *(submission.TeamID) == gameTeams[i].TeamID { + if submission.TeamID != nil && *(submission.TeamID) == gameTeams[i].TeamID && submission.GameChallenge != nil { gameTeams[i].Pts += calculate.GameChallengePts( submission.GameChallenge.MaxPts, submission.GameChallenge.MinPts, @@ -109,7 +109,7 @@ func (g *GameTeamService) Create(req request.GameTeamCreateRequest) (err error) ID: req.UserID, }) user := users[0] - if req.UserID != team.Captain.ID && (user.Group.Name != "admin" && user.Group.Name != "monitor") { + if req.UserID != team.Captain.ID && (user.Group.Name != "admin") { return errors.New("invalid team captain") } diff --git a/internal/service/team.go b/internal/service/team.go index 20ffa07a..d0250b23 100644 --- a/internal/service/team.go +++ b/internal/service/team.go @@ -4,9 +4,7 @@ import ( "errors" "github.com/elabosak233/cloudsdale/internal/model" "github.com/elabosak233/cloudsdale/internal/model/request" - "github.com/elabosak233/cloudsdale/internal/model/response" "github.com/elabosak233/cloudsdale/internal/repository" - "github.com/mitchellh/mapstructure" "math" ) @@ -14,8 +12,8 @@ type ITeamService interface { Create(req request.TeamCreateRequest) error Update(req request.TeamUpdateRequest) error Delete(id uint) error - Find(req request.TeamFindRequest) (teams []response.TeamResponse, pageCount int64, total int64, err error) - FindById(id uint) (res response.TeamResponse, err error) + Find(req request.TeamFindRequest) (teams []model.Team, pageCount int64, total int64, err error) + FindById(id uint) (team model.Team, err error) } type TeamService struct { @@ -78,13 +76,8 @@ func (t *TeamService) Delete(id uint) error { return err } -func (t *TeamService) Find(req request.TeamFindRequest) (teams []response.TeamResponse, pageCount int64, total int64, err error) { - teamsData, count, err := t.teamRepository.Find(req) - for _, team := range teamsData { - var teamResponse response.TeamResponse - _ = mapstructure.Decode(team, &teamResponse) - teams = append(teams, teamResponse) - } +func (t *TeamService) Find(req request.TeamFindRequest) (teams []model.Team, pageCount int64, total int64, err error) { + teams, count, err := t.teamRepository.Find(req) if req.Size >= 1 && req.Page >= 1 { pageCount = int64(math.Ceil(float64(count) / float64(req.Size))) } else { @@ -93,14 +86,12 @@ func (t *TeamService) Find(req request.TeamFindRequest) (teams []response.TeamRe return teams, pageCount, count, err } -func (t *TeamService) FindById(id uint) (team response.TeamResponse, err error) { +func (t *TeamService) FindById(id uint) (team model.Team, err error) { teams, _, err := t.teamRepository.Find(request.TeamFindRequest{ ID: id, }) if len(teams) > 0 { - var teamData response.TeamResponse - _ = mapstructure.Decode(teams[0], &teamData) - team = teamData + team = teams[0] } return team, err } diff --git a/internal/utils/generator/generator.go b/internal/utils/generator/generator.go index 45cf51c4..fc19d2de 100644 --- a/internal/utils/generator/generator.go +++ b/internal/utils/generator/generator.go @@ -1,8 +1,6 @@ package generator import ( - "crypto/rand" - "encoding/base64" "github.com/google/uuid" "strings" ) @@ -11,12 +9,3 @@ func GenerateFlag(flagFmt string) (flag string) { flag = strings.Replace(flagFmt, "[UUID]", uuid.NewString(), -1) return flag } - -func GenerateWebSocketKey() (string, error) { - key := make([]byte, 16) - _, err := rand.Read(key) - if err != nil { - return "", err - } - return base64.StdEncoding.EncodeToString(key), nil -}