From 69c5423f7954b641109166e03ad0ab174b3d55c6 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 11:09:42 +0300 Subject: feat: testing logging system (#55) Former-commit-id: d8c5fda30ab08b42218aead1febdf83200948763 --- backend/handlers/logs.go | 114 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 backend/handlers/logs.go (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go new file mode 100644 index 0000000..2b5713d --- /dev/null +++ b/backend/handlers/logs.go @@ -0,0 +1,114 @@ +package handlers + +import ( + "fmt" + "net/http" + + "github.com/gin-gonic/gin" + "github.com/pektezol/leastportalshub/backend/database" + "github.com/pektezol/leastportalshub/backend/models" +) + +const ( + LogTypeMod string = "Mod" + LogTypeScore string = "Score" + LogTypeLogin string = "Login" + + LogDescriptionLoginSuccess string = "Success" + LogDescriptionLoginFailToken string = "TokenFail" + LogDescriptionLoginFailValidate string = "ValidateFail" + LogDescriptionLoginFailSummary string = "SummaryFail" +) + +type Log struct { + User models.UserShort `json:"user"` + Type string `json:"type"` + Description string `json:"description"` +} + +type LogsResponse struct { + Logs []LogsResponseDetails `json:"logs"` +} + +type LogsResponseDetails struct { + User models.UserShort `json:"user"` + Log string `json:"detail"` +} + +func ModLogs(c *gin.Context) { + mod, exists := c.Get("mod") + if !exists || !mod.(bool) { + c.JSON(http.StatusUnauthorized, models.ErrorResponse("Insufficient permissions.")) + return + } + response := LogsResponse{Logs: []LogsResponseDetails{}} + sql := `SELECT u.user_name, l.user_id, l.type, l.description + FROM logs l INNER JOIN users u ON l.user_id = u.steam_id WHERE type != 'Score'` + rows, err := database.DB.Query(sql) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + for rows.Next() { + log := Log{} + err = rows.Scan(log.User.UserName, log.User.SteamID, log.Type, log.Description) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + detail := fmt.Sprintf("%s.%s", log.Type, log.Description) + response.Logs = append(response.Logs, LogsResponseDetails{ + User: models.UserShort{ + SteamID: log.User.SteamID, + UserName: log.User.UserName, + }, + Log: detail, + }) + } + c.JSON(http.StatusOK, models.Response{ + Success: true, + Message: "Successfully retrieved logs.", + Data: response, + }) +} + +func ScoreLogs(c *gin.Context) { + response := LogsResponse{Logs: []LogsResponseDetails{}} + sql := `SELECT u.user_name, l.user_id, l.type, l.description + FROM logs l INNER JOIN users u ON l.user_id = u.steam_id WHERE type = 'Score'` + rows, err := database.DB.Query(sql) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + for rows.Next() { + log := Log{} + err = rows.Scan(log.User.UserName, log.User.SteamID, log.Type, log.Description) + if err != nil { + c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) + return + } + detail := fmt.Sprintf("%s.%s", log.Type, log.Description) + response.Logs = append(response.Logs, LogsResponseDetails{ + User: models.UserShort{ + SteamID: log.User.SteamID, + UserName: log.User.UserName, + }, + Log: detail, + }) + } + c.JSON(http.StatusOK, models.Response{ + Success: true, + Message: "Successfully retrieved score logs.", + Data: response, + }) +} + +func CreateLog(user_id string, log_type string, log_description string) (err error) { + sql := `INSERT INTO logs (user_id, "type", description) VALUES($1, $2, $3)` + _, err = database.DB.Exec(sql) + if err != nil { + return err + } + return nil +} -- cgit v1.2.3 From 62de256539511038bb899eb85d3b931dfe1f4c4d Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 11:16:37 +0300 Subject: fix: actually pass the parameters for insert (#55) Former-commit-id: 5b532bdc1797151e3d5fbfa365c5126d1f8bab71 --- backend/handlers/logs.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index 2b5713d..3eadbb0 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -106,7 +106,7 @@ func ScoreLogs(c *gin.Context) { func CreateLog(user_id string, log_type string, log_description string) (err error) { sql := `INSERT INTO logs (user_id, "type", description) VALUES($1, $2, $3)` - _, err = database.DB.Exec(sql) + _, err = database.DB.Exec(sql, user_id, log_type, log_description) if err != nil { return err } -- cgit v1.2.3 From b4a7ac2f7914064b6c9a55fcea6d0105bf941c00 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 11:18:00 +0300 Subject: fix: row scan pointers (#55) Former-commit-id: ffcbfb6b07e1d7e41b19aba6dc8e3b2d261bf910 --- backend/handlers/logs.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index 3eadbb0..31fd6fd 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -51,7 +51,7 @@ func ModLogs(c *gin.Context) { } for rows.Next() { log := Log{} - err = rows.Scan(log.User.UserName, log.User.SteamID, log.Type, log.Description) + err = rows.Scan(&log.User.UserName, &log.User.SteamID, &log.Type, &log.Description) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -83,7 +83,7 @@ func ScoreLogs(c *gin.Context) { } for rows.Next() { log := Log{} - err = rows.Scan(log.User.UserName, log.User.SteamID, log.Type, log.Description) + err = rows.Scan(&log.User.UserName, &log.User.SteamID, &log.Type, &log.Description) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return -- cgit v1.2.3 From 5ee6c4abb03fdb583e94496306627d9d3db62629 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 13:40:58 +0300 Subject: feat: finalize score logs (#55) Former-commit-id: 5151b31745579814336797091d52c6252b14a4c2 --- backend/handlers/logs.go | 57 ++++++++++++++++++++++++++++++++++++------------ 1 file changed, 43 insertions(+), 14 deletions(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index 31fd6fd..c77d643 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -3,6 +3,7 @@ package handlers import ( "fmt" "net/http" + "time" "github.com/gin-gonic/gin" "github.com/pektezol/leastportalshub/backend/database" @@ -11,7 +12,6 @@ import ( const ( LogTypeMod string = "Mod" - LogTypeScore string = "Score" LogTypeLogin string = "Login" LogDescriptionLoginSuccess string = "Success" @@ -35,6 +35,19 @@ type LogsResponseDetails struct { Log string `json:"detail"` } +type ScoreLogsResponse struct { + Logs []ScoreLogsResponseDetails `json:"scores"` +} + +type ScoreLogsResponseDetails struct { + User models.UserShort `json:"user"` + Map models.MapShort `json:"map"` + ScoreCount int `json:"score_count"` + ScoreTime int `json:"score_time"` + DemoID string `json:"demo_id"` + Date time.Time `json:"date"` +} + func ModLogs(c *gin.Context) { mod, exists := c.Get("mod") if !exists || !mod.(bool) { @@ -73,29 +86,45 @@ func ModLogs(c *gin.Context) { } func ScoreLogs(c *gin.Context) { - response := LogsResponse{Logs: []LogsResponseDetails{}} - sql := `SELECT u.user_name, l.user_id, l.type, l.description - FROM logs l INNER JOIN users u ON l.user_id = u.steam_id WHERE type = 'Score'` + response := ScoreLogsResponse{Logs: []ScoreLogsResponseDetails{}} + sql := `SELECT rs.map_id, + m.name AS map_name, + u.steam_id, + u.user_name, + rs.score_count, + rs.score_time, + rs.demo_id, + rs.record_date + FROM ( + SELECT id, map_id, user_id, score_count, score_time, demo_id, record_date + FROM public.records_sp + + UNION ALL + + SELECT id, map_id, host_id AS user_id, score_count, score_time, host_demo_id AS demo_id, record_date + FROM public.records_mp + + UNION ALL + + SELECT id, map_id, partner_id AS user_id, score_count, score_time, partner_demo_id AS demo_id, record_date + FROM public.records_mp + ) AS rs + JOIN public.users AS u ON rs.user_id = u.steam_id + JOIN public.maps AS m ON rs.map_id = m.id + ORDER BY rs.record_date DESC LIMIT 100;` rows, err := database.DB.Query(sql) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } for rows.Next() { - log := Log{} - err = rows.Scan(&log.User.UserName, &log.User.SteamID, &log.Type, &log.Description) + score := ScoreLogsResponseDetails{} + err = rows.Scan(&score.Map.ID, &score.Map.Name, &score.User.SteamID, &score.User.UserName, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - detail := fmt.Sprintf("%s.%s", log.Type, log.Description) - response.Logs = append(response.Logs, LogsResponseDetails{ - User: models.UserShort{ - SteamID: log.User.SteamID, - UserName: log.User.UserName, - }, - Log: detail, - }) + response.Logs = append(response.Logs, score) } c.JSON(http.StatusOK, models.Response{ Success: true, -- cgit v1.2.3 From bef18a1641c8c9f0a8faf7d613729f439dc80a82 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 13:48:55 +0300 Subject: feat: sike, add game to score logs (#55) Former-commit-id: 4ffa3b1269c0859b6cc85defc3fa6e095102252a --- backend/handlers/logs.go | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index c77d643..0ebba47 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -40,6 +40,7 @@ type ScoreLogsResponse struct { } type ScoreLogsResponseDetails struct { + Game models.Game `json:"game"` User models.UserShort `json:"user"` Map models.MapShort `json:"map"` ScoreCount int `json:"score_count"` @@ -87,7 +88,10 @@ func ModLogs(c *gin.Context) { func ScoreLogs(c *gin.Context) { response := ScoreLogsResponse{Logs: []ScoreLogsResponseDetails{}} - sql := `SELECT rs.map_id, + sql := `SELECT g.id, + g."name", + g.is_coop, + rs.map_id, m.name AS map_name, u.steam_id, u.user_name, @@ -97,20 +101,21 @@ func ScoreLogs(c *gin.Context) { rs.record_date FROM ( SELECT id, map_id, user_id, score_count, score_time, demo_id, record_date - FROM public.records_sp + FROM records_sp UNION ALL SELECT id, map_id, host_id AS user_id, score_count, score_time, host_demo_id AS demo_id, record_date - FROM public.records_mp + FROM records_mp UNION ALL SELECT id, map_id, partner_id AS user_id, score_count, score_time, partner_demo_id AS demo_id, record_date - FROM public.records_mp + FROM records_mp ) AS rs - JOIN public.users AS u ON rs.user_id = u.steam_id - JOIN public.maps AS m ON rs.map_id = m.id + JOIN users u ON rs.user_id = u.steam_id + JOIN maps m ON rs.map_id = m.id + JOIN games g ON m.game_id = g.id ORDER BY rs.record_date DESC LIMIT 100;` rows, err := database.DB.Query(sql) if err != nil { @@ -119,7 +124,7 @@ func ScoreLogs(c *gin.Context) { } for rows.Next() { score := ScoreLogsResponseDetails{} - err = rows.Scan(&score.Map.ID, &score.Map.Name, &score.User.SteamID, &score.User.UserName, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date) + err = rows.Scan(&score.Game.ID, &score.Game.Name, &score.Game.IsCoop, &score.Map.ID, &score.Map.Name, &score.User.SteamID, &score.User.UserName, &score.ScoreCount, &score.ScoreTime, &score.DemoID, &score.Date) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return -- cgit v1.2.3 From 60fcf785ced334998e8dd19aea3b71be6a2db14f Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 13:52:45 +0300 Subject: docs: update docs for logs (#55) Former-commit-id: 0478aa459bfe9a7c81073d4ff8d8264aa1258bc1 --- backend/handlers/logs.go | 17 +++++++ docs/docs.go | 130 ++++++++++++++++++++++++++++++++++++++++++++++- docs/swagger.json | 130 ++++++++++++++++++++++++++++++++++++++++++++++- docs/swagger.yaml | 80 ++++++++++++++++++++++++++++- 4 files changed, 351 insertions(+), 6 deletions(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index 0ebba47..5233738 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -49,6 +49,15 @@ type ScoreLogsResponseDetails struct { Date time.Time `json:"date"` } +// GET Mod Logs +// +// @Description Get mod logs. +// @Tags rankings +// @Produce json +// @Param Authorization header string true "JWT Token" +// @Success 200 {object} models.Response{data=ScoreLogsResponse} +// @Failure 400 {object} models.Response +// @Router /logs/mod [get] func ModLogs(c *gin.Context) { mod, exists := c.Get("mod") if !exists || !mod.(bool) { @@ -86,6 +95,14 @@ func ModLogs(c *gin.Context) { }) } +// GET Score Logs +// +// @Description Get score logs of every player. +// @Tags rankings +// @Produce json +// @Success 200 {object} models.Response{data=ScoreLogsResponse} +// @Failure 400 {object} models.Response +// @Router /logs/score [get] func ScoreLogs(c *gin.Context) { response := ScoreLogsResponse{Logs: []ScoreLogsResponseDetails{}} sql := `SELECT g.id, diff --git a/docs/docs.go b/docs/docs.go index 72a1434..3d140cc 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -229,6 +229,89 @@ const docTemplate = `{ } } }, + "/logs/mod": { + "get": { + "description": "Get mod logs.", + "produces": [ + "application/json" + ], + "tags": [ + "rankings" + ], + "parameters": [ + { + "type": "string", + "description": "JWT Token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/handlers.ScoreLogsResponse" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, + "/logs/score": { + "get": { + "description": "Get score logs of every player.", + "produces": [ + "application/json" + ], + "tags": [ + "rankings" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/handlers.ScoreLogsResponse" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, "/maps/{id}/image": { "put": { "description": "Edit map image with specified map id.", @@ -1267,13 +1350,19 @@ const docTemplate = `{ "handlers.RankingsResponse": { "type": "object", "properties": { - "rankings_mp": { + "rankings_multiplayer": { + "type": "array", + "items": { + "$ref": "#/definitions/models.UserRanking" + } + }, + "rankings_overall": { "type": "array", "items": { "$ref": "#/definitions/models.UserRanking" } }, - "rankings_sp": { + "rankings_singleplayer": { "type": "array", "items": { "$ref": "#/definitions/models.UserRanking" @@ -1292,6 +1381,43 @@ const docTemplate = `{ } } }, + "handlers.ScoreLogsResponse": { + "type": "object", + "properties": { + "scores": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.ScoreLogsResponseDetails" + } + } + } + }, + "handlers.ScoreLogsResponseDetails": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "demo_id": { + "type": "string" + }, + "game": { + "$ref": "#/definitions/models.Game" + }, + "map": { + "$ref": "#/definitions/models.MapShort" + }, + "score_count": { + "type": "integer" + }, + "score_time": { + "type": "integer" + }, + "user": { + "$ref": "#/definitions/models.UserShort" + } + } + }, "handlers.SearchResponse": { "type": "object", "properties": { diff --git a/docs/swagger.json b/docs/swagger.json index 6fbe02e..f55190e 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -222,6 +222,89 @@ } } }, + "/logs/mod": { + "get": { + "description": "Get mod logs.", + "produces": [ + "application/json" + ], + "tags": [ + "rankings" + ], + "parameters": [ + { + "type": "string", + "description": "JWT Token", + "name": "Authorization", + "in": "header", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/handlers.ScoreLogsResponse" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, + "/logs/score": { + "get": { + "description": "Get score logs of every player.", + "produces": [ + "application/json" + ], + "tags": [ + "rankings" + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "allOf": [ + { + "$ref": "#/definitions/models.Response" + }, + { + "type": "object", + "properties": { + "data": { + "$ref": "#/definitions/handlers.ScoreLogsResponse" + } + } + } + ] + } + }, + "400": { + "description": "Bad Request", + "schema": { + "$ref": "#/definitions/models.Response" + } + } + } + } + }, "/maps/{id}/image": { "put": { "description": "Edit map image with specified map id.", @@ -1260,13 +1343,19 @@ "handlers.RankingsResponse": { "type": "object", "properties": { - "rankings_mp": { + "rankings_multiplayer": { + "type": "array", + "items": { + "$ref": "#/definitions/models.UserRanking" + } + }, + "rankings_overall": { "type": "array", "items": { "$ref": "#/definitions/models.UserRanking" } }, - "rankings_sp": { + "rankings_singleplayer": { "type": "array", "items": { "$ref": "#/definitions/models.UserRanking" @@ -1285,6 +1374,43 @@ } } }, + "handlers.ScoreLogsResponse": { + "type": "object", + "properties": { + "scores": { + "type": "array", + "items": { + "$ref": "#/definitions/handlers.ScoreLogsResponseDetails" + } + } + } + }, + "handlers.ScoreLogsResponseDetails": { + "type": "object", + "properties": { + "date": { + "type": "string" + }, + "demo_id": { + "type": "string" + }, + "game": { + "$ref": "#/definitions/models.Game" + }, + "map": { + "$ref": "#/definitions/models.MapShort" + }, + "score_count": { + "type": "integer" + }, + "score_time": { + "type": "integer" + }, + "user": { + "$ref": "#/definitions/models.UserShort" + } + } + }, "handlers.SearchResponse": { "type": "object", "properties": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 4b59ee9..4d5661e 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -165,11 +165,15 @@ definitions: type: object handlers.RankingsResponse: properties: - rankings_mp: + rankings_multiplayer: items: $ref: '#/definitions/models.UserRanking' type: array - rankings_sp: + rankings_overall: + items: + $ref: '#/definitions/models.UserRanking' + type: array + rankings_singleplayer: items: $ref: '#/definitions/models.UserRanking' type: array @@ -181,6 +185,30 @@ definitions: score_time: type: integer type: object + handlers.ScoreLogsResponse: + properties: + scores: + items: + $ref: '#/definitions/handlers.ScoreLogsResponseDetails' + type: array + type: object + handlers.ScoreLogsResponseDetails: + properties: + date: + type: string + demo_id: + type: string + game: + $ref: '#/definitions/models.Game' + map: + $ref: '#/definitions/models.MapShort' + score_count: + type: integer + score_time: + type: integer + user: + $ref: '#/definitions/models.UserShort' + type: object handlers.SearchResponse: properties: maps: @@ -444,6 +472,54 @@ paths: $ref: '#/definitions/models.Response' tags: - login + /logs/mod: + get: + description: Get mod logs. + parameters: + - description: JWT Token + in: header + name: Authorization + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + allOf: + - $ref: '#/definitions/models.Response' + - properties: + data: + $ref: '#/definitions/handlers.ScoreLogsResponse' + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/models.Response' + tags: + - rankings + /logs/score: + get: + description: Get score logs of every player. + produces: + - application/json + responses: + "200": + description: OK + schema: + allOf: + - $ref: '#/definitions/models.Response' + - properties: + data: + $ref: '#/definitions/handlers.ScoreLogsResponse' + type: object + "400": + description: Bad Request + schema: + $ref: '#/definitions/models.Response' + tags: + - rankings /maps/{id}/image: put: description: Edit map image with specified map id. -- cgit v1.2.3 From 0f493cef0fd6442bddeb3f7fa1f9ca4bd3c47917 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 13:54:11 +0300 Subject: docs: change tags for logs (#55) Former-commit-id: c3f9968ecb1a8734bbc87ad4fe28073b14b9920c --- backend/handlers/logs.go | 4 ++-- docs/docs.go | 4 ++-- docs/swagger.json | 4 ++-- docs/swagger.yaml | 4 ++-- 4 files changed, 8 insertions(+), 8 deletions(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index 5233738..882632d 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -52,7 +52,7 @@ type ScoreLogsResponseDetails struct { // GET Mod Logs // // @Description Get mod logs. -// @Tags rankings +// @Tags logs // @Produce json // @Param Authorization header string true "JWT Token" // @Success 200 {object} models.Response{data=ScoreLogsResponse} @@ -98,7 +98,7 @@ func ModLogs(c *gin.Context) { // GET Score Logs // // @Description Get score logs of every player. -// @Tags rankings +// @Tags logs // @Produce json // @Success 200 {object} models.Response{data=ScoreLogsResponse} // @Failure 400 {object} models.Response diff --git a/docs/docs.go b/docs/docs.go index 3d140cc..0523288 100644 --- a/docs/docs.go +++ b/docs/docs.go @@ -236,7 +236,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "rankings" + "logs" ], "parameters": [ { @@ -282,7 +282,7 @@ const docTemplate = `{ "application/json" ], "tags": [ - "rankings" + "logs" ], "responses": { "200": { diff --git a/docs/swagger.json b/docs/swagger.json index f55190e..6837d8a 100644 --- a/docs/swagger.json +++ b/docs/swagger.json @@ -229,7 +229,7 @@ "application/json" ], "tags": [ - "rankings" + "logs" ], "parameters": [ { @@ -275,7 +275,7 @@ "application/json" ], "tags": [ - "rankings" + "logs" ], "responses": { "200": { diff --git a/docs/swagger.yaml b/docs/swagger.yaml index 4d5661e..48e84b2 100644 --- a/docs/swagger.yaml +++ b/docs/swagger.yaml @@ -498,7 +498,7 @@ paths: schema: $ref: '#/definitions/models.Response' tags: - - rankings + - logs /logs/score: get: description: Get score logs of every player. @@ -519,7 +519,7 @@ paths: schema: $ref: '#/definitions/models.Response' tags: - - rankings + - logs /maps/{id}/image: put: description: Edit map image with specified map id. -- cgit v1.2.3 From f56488d3cf25a1141ce73378241ee0048f440842 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 21:41:02 +0300 Subject: feat: map summary logs (#55) Former-commit-id: 4ef8800f1270e3b3aa61913bef8cc07ce4a55656 --- backend/handlers/logs.go | 5 +++++ backend/handlers/mod.go | 20 ++++++++++---------- 2 files changed, 15 insertions(+), 10 deletions(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index 882632d..0fef6a1 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -18,6 +18,11 @@ const ( LogDescriptionLoginFailToken string = "TokenFail" LogDescriptionLoginFailValidate string = "ValidateFail" LogDescriptionLoginFailSummary string = "SummaryFail" + + LogDescriptionMapSummaryCreate string = "MapSummaryCreate" + LogDescriptionMapSummaryEdit string = "MapSummaryEdit" + LogDescriptionMapSummaryEditImage string = "MapSummaryEditImage" + LogDescriptionMapSummaryDelete string = "MapSummaryDelete" ) type Log struct { diff --git a/backend/handlers/mod.go b/backend/handlers/mod.go index e47cb3f..a9b7a20 100644 --- a/backend/handlers/mod.go +++ b/backend/handlers/mod.go @@ -15,7 +15,7 @@ type CreateMapSummaryRequest struct { Description string `json:"description" binding:"required"` Showcase string `json:"showcase"` UserName string `json:"user_name" binding:"required"` - ScoreCount *int `json:"score_count" binding:"required"` + ScoreCount int `json:"score_count" binding:"required"` RecordDate time.Time `json:"record_date" binding:"required"` } @@ -24,7 +24,7 @@ type EditMapSummaryRequest struct { Description string `json:"description" binding:"required"` Showcase string `json:"showcase"` UserName string `json:"user_name" binding:"required"` - ScoreCount *int `json:"score_count" binding:"required"` + ScoreCount int `json:"score_count" binding:"required"` RecordDate time.Time `json:"record_date" binding:"required"` } @@ -49,7 +49,7 @@ type EditMapImageRequest struct { // @Router /maps/{id}/summary [post] func CreateMapSummary(c *gin.Context) { // Check if user exists - _, exists := c.Get("user") + user, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return @@ -109,7 +109,7 @@ func CreateMapSummary(c *gin.Context) { c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) return } - // Return response + CreateLog(user.(models.User).SteamID, LogTypeMod, LogDescriptionMapSummaryCreate) c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully created map summary.", @@ -130,7 +130,7 @@ func CreateMapSummary(c *gin.Context) { // @Router /maps/{id}/summary [put] func EditMapSummary(c *gin.Context) { // Check if user exists - _, exists := c.Get("user") + user, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return @@ -190,7 +190,7 @@ func EditMapSummary(c *gin.Context) { c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) return } - // Return response + CreateLog(user.(models.User).SteamID, LogTypeMod, LogDescriptionMapSummaryEdit) c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully updated map summary.", @@ -211,7 +211,7 @@ func EditMapSummary(c *gin.Context) { // @Router /maps/{id}/summary [delete] func DeleteMapSummary(c *gin.Context) { // Check if user exists - _, exists := c.Get("user") + user, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return @@ -275,7 +275,7 @@ func DeleteMapSummary(c *gin.Context) { c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) return } - // Return response + CreateLog(user.(models.User).SteamID, LogTypeMod, LogDescriptionMapSummaryDelete) c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully delete map summary.", @@ -296,7 +296,7 @@ func DeleteMapSummary(c *gin.Context) { // @Router /maps/{id}/image [put] func EditMapImage(c *gin.Context) { // Check if user exists - _, exists := c.Get("user") + user, exists := c.Get("user") if !exists { c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in.")) return @@ -325,7 +325,7 @@ func EditMapImage(c *gin.Context) { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } - // Return response + CreateLog(user.(models.User).SteamID, LogTypeMod, LogDescriptionMapSummaryEditImage) c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully updated map image.", -- cgit v1.2.3 From 266698e46744063752f7cc893c539f132e3cdc37 Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sat, 2 Sep 2023 22:02:11 +0300 Subject: feat: detailed logs for records (#55) Former-commit-id: af37633ce05f08fc517cb3e8fec3e84a0bd5ba49 --- backend/handlers/logs.go | 14 ++++++++++++-- backend/handlers/record.go | 11 +++++++++++ 2 files changed, 23 insertions(+), 2 deletions(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index 0fef6a1..c971f79 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -11,8 +11,9 @@ import ( ) const ( - LogTypeMod string = "Mod" - LogTypeLogin string = "Login" + LogTypeMod string = "Mod" + LogTypeLogin string = "Login" + LogTypeRecord string = "Record" LogDescriptionLoginSuccess string = "Success" LogDescriptionLoginFailToken string = "TokenFail" @@ -23,6 +24,15 @@ const ( LogDescriptionMapSummaryEdit string = "MapSummaryEdit" LogDescriptionMapSummaryEditImage string = "MapSummaryEditImage" LogDescriptionMapSummaryDelete string = "MapSummaryDelete" + + LogDescriptionRecordSuccess string = "Success" + LogDescriptionRecordFailInsertRecord string = "InsertRecordFail" + LogDescriptionRecordFailInsertDemo string = "InsertDemoFail" + LogDescriptionRecordFailProcessDemo string = "ProcessDemoFail" + LogDescriptionRecordFailCreateDemo string = "CreateDemoFail" + LogDescriptionRecordFailOpenDemo string = "OpenDemoFail" + LogDescriptionRecordFailSaveDemo string = "SaveDemoFail" + LogDescriptionRecordFailInvalidRequest string = "InvalidRequestFail" ) type Log struct { diff --git a/backend/handlers/record.go b/backend/handlers/record.go index 00c9b7d..3d29eb8 100644 --- a/backend/handlers/record.go +++ b/backend/handlers/record.go @@ -66,6 +66,7 @@ func CreateRecordWithDemo(c *gin.Context) { return } if isDisabled { + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailInvalidRequest) c.JSON(http.StatusBadRequest, models.ErrorResponse("Map is not available for competitive boards.")) return } @@ -75,10 +76,12 @@ func CreateRecordWithDemo(c *gin.Context) { // Get record request var record RecordRequest if err := c.ShouldBind(&record); err != nil { + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailInvalidRequest) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } if isCoop && (record.PartnerDemo == nil || record.PartnerID == "") { + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailInvalidRequest) c.JSON(http.StatusBadRequest, models.ErrorResponse("Invalid entry for coop record submission.")) return } @@ -108,23 +111,27 @@ func CreateRecordWithDemo(c *gin.Context) { // Upload & insert into demos err = c.SaveUploadedFile(header, "backend/parser/"+uuid+".dem") if err != nil { + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailSaveDemo) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } defer os.Remove("backend/parser/" + uuid + ".dem") f, err := os.Open("backend/parser/" + uuid + ".dem") if err != nil { + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailOpenDemo) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } defer f.Close() file, err := createFile(srv, uuid+".dem", "application/octet-stream", f, os.Getenv("GOOGLE_FOLDER_ID")) if err != nil { + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailCreateDemo) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } hostDemoScoreCount, hostDemoScoreTime, err = parser.ProcessDemo("backend/parser/" + uuid + ".dem") if err != nil { + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailProcessDemo) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } @@ -138,6 +145,7 @@ func CreateRecordWithDemo(c *gin.Context) { _, err = tx.Exec(`INSERT INTO demos (id,location_id) VALUES ($1,$2)`, uuid, file.Id) if err != nil { deleteFile(srv, file.Id) + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailInsertDemo) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } @@ -159,6 +167,7 @@ func CreateRecordWithDemo(c *gin.Context) { if err != nil { deleteFile(srv, hostDemoFileID) deleteFile(srv, partnerDemoFileID) + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailInsertRecord) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } @@ -176,6 +185,7 @@ func CreateRecordWithDemo(c *gin.Context) { _, err := tx.Exec(sql, mapId, hostDemoScoreCount, hostDemoScoreTime, user.(models.User).SteamID, hostDemoUUID) if err != nil { deleteFile(srv, hostDemoFileID) + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordFailInsertRecord) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } @@ -192,6 +202,7 @@ func CreateRecordWithDemo(c *gin.Context) { c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) return } + CreateLog(user.(models.User).SteamID, LogTypeRecord, LogDescriptionRecordSuccess) c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully created record.", -- cgit v1.2.3 From 3eb88ce01d1e723dc93971dc25da728437912e8f Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sun, 3 Sep 2023 13:32:25 +0300 Subject: feat: update user logs (#55) Former-commit-id: 9041bf919cbd96eb135abc14318910b81340f95d --- backend/handlers/login.go | 8 ++++---- backend/handlers/logs.go | 21 ++++++++++++--------- 2 files changed, 16 insertions(+), 13 deletions(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/login.go b/backend/handlers/login.go index 80f697e..5949fdd 100644 --- a/backend/handlers/login.go +++ b/backend/handlers/login.go @@ -38,7 +38,7 @@ func Login(c *gin.Context) { default: steamID, err := openID.ValidateAndGetId() if err != nil { - CreateLog(steamID, LogTypeLogin, LogDescriptionLoginFailValidate) + CreateLog(steamID, LogTypeLogin, LogDescriptionUserLoginFailValidate) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } @@ -49,7 +49,7 @@ func Login(c *gin.Context) { if checkSteamID == 0 { user, err := GetPlayerSummaries(steamID, os.Getenv("API_KEY")) if err != nil { - CreateLog(steamID, LogTypeLogin, LogDescriptionLoginFailSummary) + CreateLog(steamID, LogTypeLogin, LogDescriptionUserLoginFailSummary) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } @@ -79,12 +79,12 @@ func Login(c *gin.Context) { // Sign and get the complete encoded token as a string using the secret tokenString, err := token.SignedString([]byte(os.Getenv("SECRET_KEY"))) if err != nil { - CreateLog(steamID, LogTypeLogin, LogDescriptionLoginFailToken) + CreateLog(steamID, LogTypeLogin, LogDescriptionUserLoginFailToken) c.JSON(http.StatusBadRequest, models.ErrorResponse("Failed to generate token.")) return } c.SetCookie("token", tokenString, 3600*24*30, "/", "", true, true) - CreateLog(steamID, LogTypeLogin, LogDescriptionLoginSuccess) + CreateLog(steamID, LogTypeLogin, LogDescriptionUserLoginSuccess) c.Redirect(http.StatusTemporaryRedirect, "/") // c.JSON(http.StatusOK, models.Response{ // Success: true, diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index c971f79..b5704d6 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -12,13 +12,13 @@ import ( const ( LogTypeMod string = "Mod" - LogTypeLogin string = "Login" + LogTypeLogin string = "User" LogTypeRecord string = "Record" - LogDescriptionLoginSuccess string = "Success" - LogDescriptionLoginFailToken string = "TokenFail" - LogDescriptionLoginFailValidate string = "ValidateFail" - LogDescriptionLoginFailSummary string = "SummaryFail" + LogDescriptionUserLoginSuccess string = "LoginSuccess" + LogDescriptionUserLoginFailToken string = "LoginTokenFail" + LogDescriptionUserLoginFailValidate string = "LoginValidateFail" + LogDescriptionUserLoginFailSummary string = "LoginSummaryFail" LogDescriptionMapSummaryCreate string = "MapSummaryCreate" LogDescriptionMapSummaryEdit string = "MapSummaryEdit" @@ -39,6 +39,7 @@ type Log struct { User models.UserShort `json:"user"` Type string `json:"type"` Description string `json:"description"` + Date time.Time `json:"date"` } type LogsResponse struct { @@ -48,6 +49,7 @@ type LogsResponse struct { type LogsResponseDetails struct { User models.UserShort `json:"user"` Log string `json:"detail"` + Date time.Time `json:"date"` } type ScoreLogsResponse struct { @@ -70,7 +72,7 @@ type ScoreLogsResponseDetails struct { // @Tags logs // @Produce json // @Param Authorization header string true "JWT Token" -// @Success 200 {object} models.Response{data=ScoreLogsResponse} +// @Success 200 {object} models.Response{data=LogsResponse} // @Failure 400 {object} models.Response // @Router /logs/mod [get] func ModLogs(c *gin.Context) { @@ -80,7 +82,7 @@ func ModLogs(c *gin.Context) { return } response := LogsResponse{Logs: []LogsResponseDetails{}} - sql := `SELECT u.user_name, l.user_id, l.type, l.description + sql := `SELECT u.user_name, l.user_id, l.type, l.description, l.date FROM logs l INNER JOIN users u ON l.user_id = u.steam_id WHERE type != 'Score'` rows, err := database.DB.Query(sql) if err != nil { @@ -89,7 +91,7 @@ func ModLogs(c *gin.Context) { } for rows.Next() { log := Log{} - err = rows.Scan(&log.User.UserName, &log.User.SteamID, &log.Type, &log.Description) + err = rows.Scan(&log.User.UserName, &log.User.SteamID, &log.Type, &log.Description, &log.Date) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return @@ -100,7 +102,8 @@ func ModLogs(c *gin.Context) { SteamID: log.User.SteamID, UserName: log.User.UserName, }, - Log: detail, + Log: detail, + Date: log.Date, }) } c.JSON(http.StatusOK, models.Response{ -- cgit v1.2.3 From 0183c98bd8b21e15ada176431cdda32581cd119a Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sun, 3 Sep 2023 13:35:46 +0300 Subject: fix: order mod logs by most recent (#55) Former-commit-id: 661ee1f70cbc8e8705e9145de9cfdc48c97daf02 --- backend/handlers/logs.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index b5704d6..8880607 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -83,7 +83,8 @@ func ModLogs(c *gin.Context) { } response := LogsResponse{Logs: []LogsResponseDetails{}} sql := `SELECT u.user_name, l.user_id, l.type, l.description, l.date - FROM logs l INNER JOIN users u ON l.user_id = u.steam_id WHERE type != 'Score'` + FROM logs l INNER JOIN users u ON l.user_id = u.steam_id WHERE type != 'Score' + ORDER BY l.date DESC LIMIT 100;` rows, err := database.DB.Query(sql) if err != nil { c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) -- cgit v1.2.3 From 3279b30b3de8e4e9aaa6558ceaa9048b5b9314bd Mon Sep 17 00:00:00 2001 From: Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> Date: Sun, 3 Sep 2023 16:20:16 +0300 Subject: feat: added logs for user update (#55) Former-commit-id: b1cfb15cd595e93494b370dda6572e48a175d46e --- backend/handlers/login.go | 8 ++++---- backend/handlers/logs.go | 15 ++++++++++----- backend/handlers/user.go | 7 +++++++ 3 files changed, 21 insertions(+), 9 deletions(-) (limited to 'backend/handlers/logs.go') diff --git a/backend/handlers/login.go b/backend/handlers/login.go index 5949fdd..85ffd63 100644 --- a/backend/handlers/login.go +++ b/backend/handlers/login.go @@ -38,7 +38,7 @@ func Login(c *gin.Context) { default: steamID, err := openID.ValidateAndGetId() if err != nil { - CreateLog(steamID, LogTypeLogin, LogDescriptionUserLoginFailValidate) + CreateLog(steamID, LogTypeUser, LogDescriptionUserLoginFailValidate) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } @@ -49,7 +49,7 @@ func Login(c *gin.Context) { if checkSteamID == 0 { user, err := GetPlayerSummaries(steamID, os.Getenv("API_KEY")) if err != nil { - CreateLog(steamID, LogTypeLogin, LogDescriptionUserLoginFailSummary) + CreateLog(steamID, LogTypeUser, LogDescriptionUserLoginFailSummary) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } @@ -79,12 +79,12 @@ func Login(c *gin.Context) { // Sign and get the complete encoded token as a string using the secret tokenString, err := token.SignedString([]byte(os.Getenv("SECRET_KEY"))) if err != nil { - CreateLog(steamID, LogTypeLogin, LogDescriptionUserLoginFailToken) + CreateLog(steamID, LogTypeUser, LogDescriptionUserLoginFailToken) c.JSON(http.StatusBadRequest, models.ErrorResponse("Failed to generate token.")) return } c.SetCookie("token", tokenString, 3600*24*30, "/", "", true, true) - CreateLog(steamID, LogTypeLogin, LogDescriptionUserLoginSuccess) + CreateLog(steamID, LogTypeUser, LogDescriptionUserLoginSuccess) c.Redirect(http.StatusTemporaryRedirect, "/") // c.JSON(http.StatusOK, models.Response{ // Success: true, diff --git a/backend/handlers/logs.go b/backend/handlers/logs.go index 8880607..2b8223a 100644 --- a/backend/handlers/logs.go +++ b/backend/handlers/logs.go @@ -12,13 +12,18 @@ import ( const ( LogTypeMod string = "Mod" - LogTypeLogin string = "User" + LogTypeUser string = "User" LogTypeRecord string = "Record" - LogDescriptionUserLoginSuccess string = "LoginSuccess" - LogDescriptionUserLoginFailToken string = "LoginTokenFail" - LogDescriptionUserLoginFailValidate string = "LoginValidateFail" - LogDescriptionUserLoginFailSummary string = "LoginSummaryFail" + LogDescriptionUserLoginSuccess string = "LoginSuccess" + LogDescriptionUserLoginFailToken string = "LoginTokenFail" + LogDescriptionUserLoginFailValidate string = "LoginValidateFail" + LogDescriptionUserLoginFailSummary string = "LoginSummaryFail" + LogDescriptionUserUpdateSuccess string = "UpdateSuccess" + LogDescriptionUserUpdateFail string = "UpdateFail" + LogDescriptionUserUpdateSummaryFail string = "UpdateSummaryFail" + LogDescriptionUserUpdateCountrySuccess string = "UpdateCountrySuccess" + LogDescriptionUserUpdateCountryFail string = "UpdateCountryFail" LogDescriptionMapSummaryCreate string = "MapSummaryCreate" LogDescriptionMapSummaryEdit string = "MapSummaryEdit" diff --git a/backend/handlers/user.go b/backend/handlers/user.go index e0f1dff..742a57c 100644 --- a/backend/handlers/user.go +++ b/backend/handlers/user.go @@ -646,6 +646,7 @@ func UpdateUser(c *gin.Context) { } profile, err := GetPlayerSummaries(user.(models.User).SteamID, os.Getenv("API_KEY")) if err != nil { + CreateLog(user.(models.User).SteamID, LogTypeUser, LogDescriptionUserUpdateSummaryFail) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } @@ -653,9 +654,11 @@ func UpdateUser(c *gin.Context) { _, err = database.DB.Exec(`UPDATE users SET username = $1, avatar_link = $2, country_code = $3, updated_at = $4 WHERE steam_id = $5`, profile.PersonaName, profile.AvatarFull, profile.LocCountryCode, time.Now().UTC(), user.(models.User).SteamID) if err != nil { + CreateLog(user.(models.User).SteamID, LogTypeUser, LogDescriptionUserUpdateFail) c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) return } + CreateLog(user.(models.User).SteamID, LogTypeUser, LogDescriptionUserUpdateSuccess) c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully updated user.", @@ -690,21 +693,25 @@ func UpdateCountryCode(c *gin.Context) { } code := c.Query("country_code") if code == "" { + CreateLog(user.(models.User).SteamID, LogTypeUser, LogDescriptionUserUpdateCountryFail) c.JSON(http.StatusNotFound, models.ErrorResponse("Enter a valid country code.")) return } var validCode string err := database.DB.QueryRow(`SELECT country_code FROM countries WHERE country_code = $1`, code).Scan(&validCode) if err != nil { + CreateLog(user.(models.User).SteamID, LogTypeUser, LogDescriptionUserUpdateCountryFail) c.JSON(http.StatusNotFound, models.ErrorResponse(err.Error())) return } // Valid code, update profile _, err = database.DB.Exec(`UPDATE users SET country_code = $1 WHERE steam_id = $2`, validCode, user.(models.User).SteamID) if err != nil { + CreateLog(user.(models.User).SteamID, LogTypeUser, LogDescriptionUserUpdateCountryFail) c.JSON(http.StatusNotFound, models.ErrorResponse(err.Error())) return } + CreateLog(user.(models.User).SteamID, LogTypeUser, LogDescriptionUserUpdateCountrySuccess) c.JSON(http.StatusOK, models.Response{ Success: true, Message: "Successfully updated country code.", -- cgit v1.2.3