aboutsummaryrefslogtreecommitdiff
path: root/backend/controllers/recordController.go
diff options
context:
space:
mode:
authorArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-01-14 02:44:36 +0300
committerArda Serdar Pektezol <1669855+pektezol@users.noreply.github.com>2023-01-14 02:44:36 +0300
commitae914b9f7a593ac83ebca9b15eba6ea79524ae4c (patch)
treea48686df978db1df6844fb60c68f334a080a5a53 /backend/controllers/recordController.go
parentdemo to google drive is worknig properly (#20) (diff)
downloadlphub-ae914b9f7a593ac83ebca9b15eba6ea79524ae4c.tar.gz
lphub-ae914b9f7a593ac83ebca9b15eba6ea79524ae4c.tar.bz2
lphub-ae914b9f7a593ac83ebca9b15eba6ea79524ae4c.zip
record submission looks like its working! (#23, #20)
Diffstat (limited to 'backend/controllers/recordController.go')
-rw-r--r--backend/controllers/recordController.go140
1 files changed, 96 insertions, 44 deletions
diff --git a/backend/controllers/recordController.go b/backend/controllers/recordController.go
index a44d6f6..81eb465 100644
--- a/backend/controllers/recordController.go
+++ b/backend/controllers/recordController.go
@@ -3,14 +3,14 @@ package controllers
3import ( 3import (
4 "context" 4 "context"
5 b64 "encoding/base64" 5 b64 "encoding/base64"
6 "fmt"
7 "io" 6 "io"
8 "log" 7 "log"
9 "net/http" 8 "net/http"
10 "os" 9 "os"
11 "time" 10 "strconv"
12 11
13 "github.com/gin-gonic/gin" 12 "github.com/gin-gonic/gin"
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 "golang.org/x/oauth2/google" 16 "golang.org/x/oauth2/google"
@@ -23,73 +23,125 @@ func CreateRecordWithDemo(c *gin.Context) {
23 // Check if user exists 23 // Check if user exists
24 user, exists := c.Get("user") 24 user, exists := c.Get("user")
25 if !exists { 25 if !exists {
26 c.JSON(http.StatusUnauthorized, gin.H{ 26 c.JSON(http.StatusUnauthorized, models.ErrorResponse("User not logged in."))
27 "code": http.StatusUnauthorized,
28 "output": gin.H{
29 "error": "User not logged in. Could be invalid token.",
30 },
31 })
32 return 27 return
33 } 28 }
34 var record models.Record 29 // Check if map is sp or mp
35 err := c.Bind(&record) 30 var isCoop bool
31 err := database.DB.QueryRow(`SELECT is_coop FROM maps WHERE id = $1;`, mapId).Scan(&isCoop)
36 if err != nil { 32 if err != nil {
37 c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) 33 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
38 return 34 return
39 } 35 }
40 var recordCount int 36 // Get record request
41 err = database.DB.QueryRow(`SELECT COUNT(id) FROM records;`).Scan(&recordCount) 37 var record models.Record
38 score_count, err := strconv.Atoi(c.PostForm("score_count"))
42 if err != nil { 39 if err != nil {
43 c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) 40 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
44 return 41 return
45 } 42 }
46 // var mapName string 43 score_time, err := strconv.Atoi(c.PostForm("score_time"))
47 // err = database.DB.QueryRow(`SELECT map_name FROM maps WHERE id = $1;`, mapId).Scan(&mapName)
48 // if err != nil {
49 // c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error()))
50 // return
51 // }
52 outputDemoName := fmt.Sprintf("%s_%s_%d", time.Now().UTC().Format("2006-01-02"), user.(models.User).SteamID, recordCount)
53 header, err := c.FormFile("file")
54 if err != nil { 44 if err != nil {
55 c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) 45 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
56 return 46 return
57 } 47 }
58 err = c.SaveUploadedFile(header, "docs/"+header.Filename) 48 is_partner_orange, err := strconv.ParseBool(c.PostForm("is_partner_orange"))
59 if err != nil { 49 if err != nil {
60 c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) 50 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
61 return 51 return
62 } 52 }
63 f, err := os.Open("docs/" + header.Filename) 53 record.ScoreCount = score_count
54 record.ScoreTime = score_time
55 record.PartnerID = c.PostForm("partner_id")
56 record.IsPartnerOrange = is_partner_orange
57 // Multipart form
58 form, err := c.MultipartForm()
64 if err != nil { 59 if err != nil {
65 c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) 60 c.String(http.StatusBadRequest, "get form err: %s", err.Error())
66 return 61 return
67 } 62 }
68 defer f.Close() 63 files := form.File["demos"]
69 client := serviceAccount() 64 if len(files) != 2 && isCoop {
70 srv, err := drive.New(client) 65 c.JSON(http.StatusBadRequest, models.ErrorResponse("Not enough demos for coop submission."))
71 if err != nil {
72 c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error()))
73 return 66 return
74 } 67 }
75 file, err := createFile(srv, outputDemoName, "application/octet-stream", f, os.Getenv("GOOGLE_FOLDER_ID")) 68 if len(files) != 1 && !isCoop {
76 if err != nil { 69 c.JSON(http.StatusBadRequest, models.ErrorResponse("Too many demos for singleplayer submission."))
77 c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error()))
78 return 70 return
79 } 71 }
80 os.Remove("docs/" + header.Filename) 72 var hostDemoUUID string
81 // Demo upload success 73 var partnerDemoUUID string
82 // Insert record into database 74 for i, header := range files {
83 sql := `INSERT INTO records(map_id,host_id,score_count,score_time,is_coop,partner_id,demo_id) 75 uuid := uuid.New().String()
84 VALUES ($1, $2, $3, $4, $5, $6, $7);` 76 // Upload & insert into demos
85 _, err = database.DB.Exec(sql, mapId, user.(models.User).SteamID, record.ScoreCount, record.ScoreTime, record.IsCoop, record.PartnerID, file.Id) 77 err = c.SaveUploadedFile(header, "docs/"+header.Filename)
86 if err != nil { 78 if err != nil {
87 c.JSON(http.StatusInternalServerError, models.ErrorResponse(err.Error())) 79 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
88 return 80 return
81 }
82 f, err := os.Open("docs/" + header.Filename)
83 if err != nil {
84 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
85 return
86 }
87 defer f.Close()
88 client := serviceAccount()
89 srv, err := drive.New(client)
90 if err != nil {
91 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
92 return
93 }
94 file, err := createFile(srv, uuid, "application/octet-stream", f, os.Getenv("GOOGLE_FOLDER_ID"))
95 if err != nil {
96 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
97 return
98 }
99 if i == 0 {
100 hostDemoUUID = uuid
101 }
102 if i == 1 {
103 partnerDemoUUID = uuid
104 }
105 _, err = database.DB.Exec(`INSERT INTO demos (id,location_id) VALUES ($1,$2)`, uuid, file.Id)
106 if err != nil {
107 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
108 return
109 }
110 os.Remove("docs/" + header.Filename)
111 }
112 // Insert into records
113 if isCoop {
114 sql := `INSERT INTO records_mp(map_id,score_count,score_time,host_id,partner_id,host_demo_id,partner_demo_id)
115 VALUES($1, $2, $3, $4, $5, $6, $7);`
116 var hostID string
117 var partnerID string
118 if record.IsPartnerOrange {
119 hostID = user.(models.User).SteamID
120 partnerID = record.PartnerID
121 } else {
122 partnerID = user.(models.User).SteamID
123 hostID = record.PartnerID
124 }
125 _, err := database.DB.Exec(sql, mapId, record.ScoreCount, record.ScoreTime, hostID, partnerID, hostDemoUUID, partnerDemoUUID)
126 if err != nil {
127 _, err = database.DB.Exec(`DELETE FROM demos WHERE id = $1 OR id = $2;`, hostDemoUUID, partnerDemoUUID)
128 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
129 return
130 }
131 } else {
132 sql := `INSERT INTO records_sp(map_id,score_count,score_time,user_id,demo_id)
133 VALUES($1, $2, $3, $4, $5);`
134 _, err := database.DB.Exec(sql, mapId, record.ScoreCount, record.ScoreTime, user.(models.User).SteamID, hostDemoUUID)
135 if err != nil {
136 _, err = database.DB.Exec(`DELETE FROM demos WHERE id = $1;`, hostDemoUUID)
137 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
138 return
139 }
89 } 140 }
90 c.JSON(http.StatusOK, models.Response{ 141 c.JSON(http.StatusOK, models.Response{
91 Success: true, 142 Success: true,
92 Message: "Successfully created record.", 143 Message: "Successfully created record.",
144 Data: record,
93 }) 145 })
94 return 146 return
95} 147}