aboutsummaryrefslogtreecommitdiff
path: root/backend
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-06-29 10:45:12 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-06-29 10:45:12 +0300
commit7050773414c550b7693c41a9bdd8cb390d7ef647 (patch)
tree3cbab014f2ccfbb5425f306dbda5a9efd1efa4cf /backend
parentfeat: mod edit for map summary (diff)
downloadlphub-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.go87
-rw-r--r--backend/models/requests.go4
-rw-r--r--backend/parser/parser.go7
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
24type RecordRequest struct { 24type 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 @@
1package parser
2
3import "mime/multipart"
4
5func ProcessDemo(demo *multipart.FileHeader) (scoreCount int, scoreTime int, err error) {
6 return 0, 0, nil
7}