diff options
| author | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-06-29 10:45:12 +0300 |
|---|---|---|
| committer | Arda Serdar Pektezol <1669855+pektezol@users.noreply.github.com> | 2023-06-29 10:45:12 +0300 |
| commit | 7050773414c550b7693c41a9bdd8cb390d7ef647 (patch) | |
| tree | 3cbab014f2ccfbb5425f306dbda5a9efd1efa4cf /backend | |
| parent | feat: mod edit for map summary (diff) | |
| download | lphub-7050773414c550b7693c41a9bdd8cb390d7ef647.tar.gz lphub-7050773414c550b7693c41a9bdd8cb390d7ef647.tar.bz2 lphub-7050773414c550b7693c41a9bdd8cb390d7ef647.zip | |
fix: record controller
Former-commit-id: bff6b62474e02f644d93f49827145cfd92682c6f
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/controllers/recordController.go | 87 | ||||
| -rw-r--r-- | backend/models/requests.go | 4 | ||||
| -rw-r--r-- | backend/parser/parser.go | 7 |
3 files changed, 41 insertions, 57 deletions
diff --git a/backend/controllers/recordController.go b/backend/controllers/recordController.go index 627be57..aec31bb 100644 --- a/backend/controllers/recordController.go +++ b/backend/controllers/recordController.go | |||
| @@ -5,14 +5,15 @@ import ( | |||
| 5 | b64 "encoding/base64" | 5 | b64 "encoding/base64" |
| 6 | "io" | 6 | "io" |
| 7 | "log" | 7 | "log" |
| 8 | "mime/multipart" | ||
| 8 | "net/http" | 9 | "net/http" |
| 9 | "os" | 10 | "os" |
| 10 | "strconv" | ||
| 11 | 11 | ||
| 12 | "github.com/gin-gonic/gin" | 12 | "github.com/gin-gonic/gin" |
| 13 | "github.com/google/uuid" | 13 | "github.com/google/uuid" |
| 14 | "github.com/pektezol/leastportals/backend/database" | 14 | "github.com/pektezol/leastportals/backend/database" |
| 15 | "github.com/pektezol/leastportals/backend/models" | 15 | "github.com/pektezol/leastportals/backend/models" |
| 16 | "github.com/pektezol/leastportals/backend/parser" | ||
| 16 | "golang.org/x/oauth2/google" | 17 | "golang.org/x/oauth2/google" |
| 17 | "golang.org/x/oauth2/jwt" | 18 | "golang.org/x/oauth2/jwt" |
| 18 | "google.golang.org/api/drive/v3" | 19 | "google.golang.org/api/drive/v3" |
| @@ -25,9 +26,8 @@ import ( | |||
| 25 | // @Accept mpfd | 26 | // @Accept mpfd |
| 26 | // @Produce json | 27 | // @Produce json |
| 27 | // @Param Authorization header string true "JWT Token" | 28 | // @Param Authorization header string true "JWT Token" |
| 28 | // @Param demos formData []file true "Demos" | 29 | // @Param host_demo formData file true "Host Demo" |
| 29 | // @Param score_count formData int true "Score Count" | 30 | // @Param partner_demo formData file true "Partner Demo" |
| 30 | // @Param score_time formData int true "Score Time" | ||
| 31 | // @Param is_partner_orange formData boolean true "Is Partner Orange" | 31 | // @Param is_partner_orange formData boolean true "Is Partner Orange" |
| 32 | // @Param partner_id formData string true "Partner ID" | 32 | // @Param partner_id formData string true "Partner ID" |
| 33 | // @Success 200 {object} models.Response{data=models.RecordRequest} | 33 | // @Success 200 {object} models.Response{data=models.RecordRequest} |
| @@ -43,11 +43,11 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 43 | return | 43 | return |
| 44 | } | 44 | } |
| 45 | // Check if map is sp or mp | 45 | // Check if map is sp or mp |
| 46 | var gameID int | 46 | var gameName string |
| 47 | var isCoop bool | 47 | var isCoop bool |
| 48 | var isDisabled bool | 48 | var isDisabled bool |
| 49 | sql := `SELECT game_id, is_disabled FROM maps WHERE id = $1` | 49 | sql := `SELECT g.name, m.is_disabled FROM maps m INNER JOIN games g ON m.game_id=g.id WHERE id = $1` |
| 50 | err := database.DB.QueryRow(sql, mapId).Scan(&gameID, &isDisabled) | 50 | err := database.DB.QueryRow(sql, mapId).Scan(&gameName, &isDisabled) |
| 51 | if err != nil { | 51 | if err != nil { |
| 52 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 52 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 53 | return | 53 | return |
| @@ -56,51 +56,23 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 56 | c.JSON(http.StatusBadRequest, models.ErrorResponse("Map is not available for competitive boards.")) | 56 | c.JSON(http.StatusBadRequest, models.ErrorResponse("Map is not available for competitive boards.")) |
| 57 | return | 57 | return |
| 58 | } | 58 | } |
| 59 | if gameID == 2 { | 59 | if gameName == "Portal 2 - Cooperative" { |
| 60 | isCoop = true | 60 | isCoop = true |
| 61 | } | 61 | } |
| 62 | // Get record request | 62 | // Get record request |
| 63 | var record models.RecordRequest | 63 | var record models.RecordRequest |
| 64 | score_count, err := strconv.Atoi(c.PostForm("score_count")) | 64 | if err := c.ShouldBind(&record); err != nil { |
| 65 | if err != nil { | ||
| 66 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | ||
| 67 | return | ||
| 68 | } | ||
| 69 | score_time, err := strconv.Atoi(c.PostForm("score_time")) | ||
| 70 | if err != nil { | ||
| 71 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | ||
| 72 | return | ||
| 73 | } | ||
| 74 | is_partner_orange, err := strconv.ParseBool(c.PostForm("is_partner_orange")) | ||
| 75 | if err != nil { | ||
| 76 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | ||
| 77 | return | ||
| 78 | } | ||
| 79 | record.ScoreCount = score_count | ||
| 80 | record.ScoreTime = score_time | ||
| 81 | record.PartnerID = c.PostForm("partner_id") | ||
| 82 | record.IsPartnerOrange = is_partner_orange | ||
| 83 | if record.PartnerID == "" { | ||
| 84 | c.JSON(http.StatusBadRequest, models.ErrorResponse("No partner id given.")) | ||
| 85 | return | ||
| 86 | } | ||
| 87 | // Multipart form | ||
| 88 | form, err := c.MultipartForm() | ||
| 89 | if err != nil { | ||
| 90 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 65 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 91 | return | 66 | return |
| 92 | } | 67 | } |
| 93 | files := form.File["demos"] | 68 | if isCoop && (record.PartnerDemo == nil || record.PartnerID == "") { |
| 94 | if len(files) != 2 && isCoop { | 69 | c.JSON(http.StatusBadRequest, models.ErrorResponse("Invalid entry for coop record submission.")) |
| 95 | c.JSON(http.StatusBadRequest, models.ErrorResponse("Not enough demos for coop submission.")) | ||
| 96 | return | ||
| 97 | } | ||
| 98 | if len(files) != 1 && !isCoop { | ||
| 99 | c.JSON(http.StatusBadRequest, models.ErrorResponse("Too many demos for singleplayer submission.")) | ||
| 100 | return | 70 | return |
| 101 | } | 71 | } |
| 102 | var hostDemoUUID string | 72 | // Demo files |
| 103 | var partnerDemoUUID string | 73 | demoFiles := []*multipart.FileHeader{record.HostDemo, record.PartnerDemo} |
| 74 | var hostDemoUUID, hostDemoFileID, partnerDemoUUID, partnerDemoFileID string | ||
| 75 | var hostDemoScoreCount, hostDemoScoreTime int | ||
| 104 | client := serviceAccount() | 76 | client := serviceAccount() |
| 105 | srv, err := drive.New(client) | 77 | srv, err := drive.New(client) |
| 106 | if err != nil { | 78 | if err != nil { |
| @@ -115,16 +87,15 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 115 | } | 87 | } |
| 116 | // Defer to a rollback in case anything fails | 88 | // Defer to a rollback in case anything fails |
| 117 | defer tx.Rollback() | 89 | defer tx.Rollback() |
| 118 | fileID := "" | 90 | for i, header := range demoFiles { |
| 119 | for i, header := range files { | ||
| 120 | uuid := uuid.New().String() | 91 | uuid := uuid.New().String() |
| 121 | // Upload & insert into demos | 92 | // Upload & insert into demos |
| 122 | err = c.SaveUploadedFile(header, "docs/"+header.Filename) | 93 | err = c.SaveUploadedFile(header, "parser/demos/"+header.Filename) |
| 123 | if err != nil { | 94 | if err != nil { |
| 124 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 95 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 125 | return | 96 | return |
| 126 | } | 97 | } |
| 127 | f, err := os.Open("docs/" + header.Filename) | 98 | f, err := os.Open("parser/demos/" + header.Filename) |
| 128 | if err != nil { | 99 | if err != nil { |
| 129 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 100 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 130 | return | 101 | return |
| @@ -135,11 +106,16 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 135 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 106 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 136 | return | 107 | return |
| 137 | } | 108 | } |
| 138 | fileID = file.Id | 109 | hostDemoScoreCount, hostDemoScoreTime, err = parser.ProcessDemo(record.HostDemo) |
| 110 | if err != nil { | ||
| 111 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | ||
| 112 | return | ||
| 113 | } | ||
| 139 | if i == 0 { | 114 | if i == 0 { |
| 115 | hostDemoFileID = file.Id | ||
| 140 | hostDemoUUID = uuid | 116 | hostDemoUUID = uuid |
| 141 | } | 117 | } else if i == 1 { |
| 142 | if i == 1 { | 118 | partnerDemoFileID = file.Id |
| 143 | partnerDemoUUID = uuid | 119 | partnerDemoUUID = uuid |
| 144 | } | 120 | } |
| 145 | _, err = tx.Exec(`INSERT INTO demos (id,location_id) VALUES ($1,$2)`, uuid, file.Id) | 121 | _, err = tx.Exec(`INSERT INTO demos (id,location_id) VALUES ($1,$2)`, uuid, file.Id) |
| @@ -148,7 +124,7 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 148 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 124 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 149 | return | 125 | return |
| 150 | } | 126 | } |
| 151 | os.Remove("docs/" + header.Filename) | 127 | os.Remove("parser/demos/" + header.Filename) |
| 152 | } | 128 | } |
| 153 | // Insert into records | 129 | // Insert into records |
| 154 | if isCoop { | 130 | if isCoop { |
| @@ -163,9 +139,10 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 163 | partnerID = user.(models.User).SteamID | 139 | partnerID = user.(models.User).SteamID |
| 164 | hostID = record.PartnerID | 140 | hostID = record.PartnerID |
| 165 | } | 141 | } |
| 166 | _, err := tx.Exec(sql, mapId, record.ScoreCount, record.ScoreTime, hostID, partnerID, hostDemoUUID, partnerDemoUUID) | 142 | _, err := tx.Exec(sql, mapId, hostDemoScoreCount, hostDemoScoreTime, hostID, partnerID, hostDemoUUID, partnerDemoUUID) |
| 167 | if err != nil { | 143 | if err != nil { |
| 168 | deleteFile(srv, fileID) | 144 | deleteFile(srv, hostDemoFileID) |
| 145 | deleteFile(srv, partnerDemoFileID) | ||
| 169 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 146 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 170 | return | 147 | return |
| 171 | } | 148 | } |
| @@ -180,9 +157,9 @@ func CreateRecordWithDemo(c *gin.Context) { | |||
| 180 | } else { | 157 | } else { |
| 181 | sql := `INSERT INTO records_sp(map_id,score_count,score_time,user_id,demo_id) | 158 | sql := `INSERT INTO records_sp(map_id,score_count,score_time,user_id,demo_id) |
| 182 | VALUES($1, $2, $3, $4, $5)` | 159 | VALUES($1, $2, $3, $4, $5)` |
| 183 | _, err := tx.Exec(sql, mapId, record.ScoreCount, record.ScoreTime, user.(models.User).SteamID, hostDemoUUID) | 160 | _, err := tx.Exec(sql, mapId, hostDemoScoreCount, hostDemoScoreTime, user.(models.User).SteamID, hostDemoUUID) |
| 184 | if err != nil { | 161 | if err != nil { |
| 185 | deleteFile(srv, fileID) | 162 | deleteFile(srv, hostDemoFileID) |
| 186 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) | 163 | c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error())) |
| 187 | return | 164 | return |
| 188 | } | 165 | } |
diff --git a/backend/models/requests.go b/backend/models/requests.go index e95eab6..4b4657b 100644 --- a/backend/models/requests.go +++ b/backend/models/requests.go | |||
| @@ -22,8 +22,8 @@ type CreateMapHistoryRequest struct { | |||
| 22 | } | 22 | } |
| 23 | 23 | ||
| 24 | type RecordRequest struct { | 24 | type RecordRequest struct { |
| 25 | HostDemo *multipart.FileHeader `json:"host_demo" form:"host_demo" binding:"required"` | 25 | HostDemo *multipart.FileHeader `json:"host_demo" form:"host_demo" binding:"required" swaggerignore:"true"` |
| 26 | PartnerDemo *multipart.FileHeader `json:"partner_demo" form:"partner_demo"` | 26 | PartnerDemo *multipart.FileHeader `json:"partner_demo" form:"partner_demo" swaggerignore:"true"` |
| 27 | IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange"` | 27 | IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange"` |
| 28 | PartnerID string `json:"partner_id" form:"partner_id"` | 28 | PartnerID string `json:"partner_id" form:"partner_id"` |
| 29 | } | 29 | } |
diff --git a/backend/parser/parser.go b/backend/parser/parser.go new file mode 100644 index 0000000..6f9a24f --- /dev/null +++ b/backend/parser/parser.go | |||
| @@ -0,0 +1,7 @@ | |||
| 1 | package parser | ||
| 2 | |||
| 3 | import "mime/multipart" | ||
| 4 | |||
| 5 | func ProcessDemo(demo *multipart.FileHeader) (scoreCount int, scoreTime int, err error) { | ||
| 6 | return 0, 0, nil | ||
| 7 | } | ||