Skip to content

Commit e5d75e6

Browse files
committed
update: Update some APIs
1 parent 991337f commit e5d75e6

File tree

6 files changed

+106
-8
lines changed

6 files changed

+106
-8
lines changed

server/router/api/v1/challenge_service.go

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,5 +137,60 @@ func GetFullChallenges(c echo.Context) error {
137137
return PermissionDenied(&c)
138138
}
139139

140-
return OKWithData(&c, game.Challenges)
140+
challenges := game.Challenges
141+
filtered := make([]*store.Challenge, 0)
142+
for _, challenge := range challenges {
143+
if !game.Visibility && !user.HasPrivilege(store.UserPrivilegeAdministrator) && !game.IsManager(user) {
144+
continue
145+
}
146+
filtered = append(filtered, challenge)
147+
}
148+
149+
return OKWithData(&c, filtered)
150+
}
151+
152+
func GetChallengeStatus(c echo.Context) error {
153+
ctx := c.(*context.CustomContext)
154+
user, _ := GetUserFromToken(&c)
155+
156+
game_uuid := ctx.Param("game_uuid")
157+
game, err := ctx.Store.GetGameByUUID(game_uuid)
158+
if err != nil {
159+
return Failed(&c, "Unable to fetch game")
160+
}
161+
162+
if !game.Visibility && !user.HasPrivilege(store.UserPrivilegeAdministrator) && !game.IsManager(user) {
163+
return PermissionDenied(&c)
164+
}
165+
166+
challenges := game.Challenges
167+
filtered := make([]*store.Challenge, 0)
168+
for _, challenge := range challenges {
169+
if !game.Visibility && !user.HasPrivilege(store.UserPrivilegeAdministrator) && !game.IsManager(user) {
170+
continue
171+
}
172+
filtered = append(filtered, challenge)
173+
}
174+
175+
resp := map[string]any{}
176+
177+
team := game.GetTeamByUser(ctx.Store, user)
178+
179+
for _, challenge := range filtered {
180+
if challenge.IsSolvedBy(team, ctx.Store) {
181+
resp[challenge.UUID] = map[string]any{
182+
"solved": true,
183+
"score": challenge.GetScore(team, ctx.Store),
184+
"solved_count": challenge.GetSolvedCount(ctx.Store),
185+
}
186+
} else {
187+
resp[challenge.UUID] = map[string]any{
188+
"solved": false,
189+
"score": 0,
190+
"solved_count": challenge.GetSolvedCount(ctx.Store),
191+
}
192+
}
193+
}
194+
195+
return OKWithData(&c, resp)
141196
}

server/router/api/v1/team_service.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,3 +77,24 @@ func CreateTeam(c echo.Context) error {
7777
"team_uuid": uuid,
7878
})
7979
}
80+
81+
func GetTeamScore(c echo.Context) error {
82+
ctx := c.(*context.CustomContext)
83+
84+
user, _ := GetUserFromToken(&c)
85+
game, err := ctx.Store.GetGameByUUID(ctx.Param("game_uuid"))
86+
if err != nil || !(game.Visibility || user.HasPrivilege(store.UserPrivilegeAdministrator) || game.IsManager(user)) {
87+
return Failed(&c, "Unable to fetch game")
88+
}
89+
90+
team := game.GetTeamByUser(ctx.Store, user)
91+
92+
if team == nil {
93+
return Failed(&c, "You are not in a team")
94+
}
95+
96+
return OKWithData(&c, map[string]any{
97+
"score": team.GetTeamScore(ctx.Store),
98+
"rank": team.GetTeamRank(ctx.Store),
99+
})
100+
}

server/server.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,7 @@ func registerRouter(s *Server) {
112112
// teamApi.GET("", v1.GetTeams).Name = "get-teams"
113113
// teamApi.GET("/:uuid", v1.GetTeam).Name = "get-team"
114114
teamApi.POST("/create", v1.CreateTeam).Name = "create-team"
115+
teamApi.GET("/score", v1.GetTeamScore).Name = "get-team-score"
115116
// teamApi.POST("/:uuid/ban", v1.BanTeam).Name = "ban-team"
116117

117118
// Challenge APIs
@@ -122,7 +123,7 @@ func registerRouter(s *Server) {
122123
challengeApi.POST("/create/container", v1.CreateContainer).Name = "create-test-container"
123124
challengeApi.DELETE("/create/container/:container_uuid", v1.DisposeContainer).Name = "dispose-test-container"
124125
challengeApi.POST("/:challenge_uuid/flag", v1.SubmitFlag).Name = "submit-flag"
125-
challengeApi.POST("/:challenge_uuid/container/create", v1.CreateChallengeContainer).Name = "create-challenge-container"
126+
challengeApi.GET("/status", v1.GetChallengeStatus).Name = "get-challenge-status"
126127

127128
// Container APIs
128129
containerApi := challengeApi.Group("/:challenge_uuid/container")
@@ -198,7 +199,7 @@ func NewServer(ctx context.Context, config *config.Config, clientSet *kubernetes
198199

199200
registerRouter(s)
200201

201-
// TODO: frontend server register here
202+
echoServer.Static("/", "public")
202203

203204
slog.Info(fmt.Sprintf("Hoshino web server is running on %s:%d.", config.Address, config.Port))
204205
return s, nil

store/challenge.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,3 +143,15 @@ func (c *Challenge) IsSolvedBy(team *Team, s *Store) bool {
143143
s.db.Model(Flag{}).Where("team_id = ? AND challenge_id = ? AND state >= 1", team.ID, c.ID).Count(&count)
144144
return count > 0
145145
}
146+
147+
func (c *Challenge) GetScore(team *Team, s *Store) int {
148+
var score int
149+
s.db.Model(Flag{}).Where("team_id = ? AND challenge_id = ? AND state >= 1", team.ID, c.ID).Select("score").First(&score)
150+
return score
151+
}
152+
153+
func (c *Challenge) GetSolvedCount(s *Store) int {
154+
var count int64
155+
s.db.Model(Flag{}).Where("challenge_id = ? AND state >= 1", c.ID).Count(&count)
156+
return int(count)
157+
}

store/container.go

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,7 @@ type Container struct {
4848
func (s *Store) CanCreateContainer(user *User) bool {
4949
var count int64
5050

51-
s.db.Model(Container{}).Where(&Container{
52-
Creator: user,
53-
Status: ContainerStatusRunning,
54-
}).Count(&count)
51+
s.db.Model(Container{}).Where("creator_id = ? AND status = 1").Count(&count)
5552

5653
max := s.GetSettingInt("max_container_per_user")
5754

store/team.go

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ type Team struct {
4141

4242
// The team is under a game
4343
GameID uint `gorm:"not null" json:"-"`
44-
Game *Game `gorm:"foreignKey:GameID" json:"game"`
44+
Game *Game `gorm:"foreignKey:GameID" json:"-"`
4545

4646
// Is the team banned
4747
Banned bool `gorm:"default:false" json:"banned"`
@@ -116,3 +116,15 @@ func (s *Store) GetTeamByUUID(uuid string) (*Team, error) {
116116
err := s.db.Where("uuid = ?", uuid).First(&team).Error
117117
return &team, err
118118
}
119+
120+
func (t *Team) GetTeamScore(s *Store) int {
121+
var score int
122+
s.db.Model(Flag{}).Where("team_id = ? AND state >= 1", t.ID).Select("sum(score)").Row().Scan(&score)
123+
return score
124+
}
125+
126+
func (t *Team) GetTeamRank(s *Store) int64 {
127+
var rank int64
128+
s.db.Model(&Team{}).Where("game_id = ? AND (SELECT sum(score) FROM flags WHERE team_id = teams.id AND state >= 1) > ?", t.GameID, t.GetTeamScore(s)).Count(&rank)
129+
return rank + 1
130+
}

0 commit comments

Comments
 (0)