aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--backend/controllers/mapController.go79
-rw-r--r--backend/models/models.go32
-rw-r--r--backend/routes/routes.go1
3 files changed, 110 insertions, 2 deletions
diff --git a/backend/controllers/mapController.go b/backend/controllers/mapController.go
new file mode 100644
index 0000000..c26d1ad
--- /dev/null
+++ b/backend/controllers/mapController.go
@@ -0,0 +1,79 @@
1package controllers
2
3import (
4 "net/http"
5 "strconv"
6
7 "github.com/gin-gonic/gin"
8 "github.com/pektezol/leastportals/backend/database"
9 "github.com/pektezol/leastportals/backend/models"
10)
11
12func FetchMap(c *gin.Context) {
13 id := c.Param("id")
14 // Get map data
15 var mapData models.Map
16 var isDisabled bool
17 intID, err := strconv.Atoi(id)
18 if err != nil {
19 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
20 return
21 }
22 mapData.ID = intID
23 sql := `SELECT map_name, wr_score, wr_time, is_coop, is_disabled FROM maps WHERE id = $1;`
24 err = database.DB.QueryRow(sql, id).Scan(&mapData.Name, &mapData.ScoreWR, &mapData.TimeWR, &mapData.IsCoop, &isDisabled)
25 if err != nil {
26 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
27 return
28 }
29 if isDisabled {
30 c.JSON(http.StatusBadRequest, models.ErrorResponse("Map is not available for competitive boards."))
31 return
32 }
33 // Get records from the map
34 if mapData.IsCoop {
35 var records []models.RecordMP
36 sql = `SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date
37 FROM records_mp WHERE map_id = $1;`
38 rows, err := database.DB.Query(sql, id)
39 if err != nil {
40 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
41 return
42 }
43 for rows.Next() {
44 var record models.RecordMP
45 err := rows.Scan(&record.RecordID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate)
46 if err != nil {
47 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
48 return
49 }
50 records = append(records, record)
51 }
52 mapData.Records = records
53 } else {
54 var records []models.RecordSP
55 sql = `SELECT id, user_id, score_count, score_time, demo_id, record_date
56 FROM records_sp WHERE map_id = $1;`
57 rows, err := database.DB.Query(sql, id)
58 if err != nil {
59 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
60 return
61 }
62 for rows.Next() {
63 var record models.RecordSP
64 err := rows.Scan(&record.RecordID, &record.UserID, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate)
65 if err != nil {
66 c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
67 return
68 }
69 records = append(records, record)
70 }
71 mapData.Records = records
72 }
73 // Return response
74 c.JSON(http.StatusOK, models.Response{
75 Success: true,
76 Message: "Successfully retrieved map data.",
77 Data: mapData,
78 })
79}
diff --git a/backend/models/models.go b/backend/models/models.go
index 8f4a5e5..7de5812 100644
--- a/backend/models/models.go
+++ b/backend/models/models.go
@@ -13,10 +13,38 @@ type User struct {
13 UpdatedAt time.Time `json:"updated_at"` 13 UpdatedAt time.Time `json:"updated_at"`
14} 14}
15 15
16type Record struct { 16type Map struct {
17 ID int `json:"id"`
18 Name string `json:"name"`
19 ScoreWR int `json:"wr_score"`
20 TimeWR int `json:"wr_time"`
21 IsCoop bool `json:"is_coop"`
22 Records any `json:"records"`
23}
24
25type RecordSP struct {
26 RecordID int `json:"record_id"`
27 UserID string `json:"user_id"`
28 ScoreCount int `json:"score_count"`
29 ScoreTime int `json:"score_time"`
30 DemoID string `json:"demo_id"`
31 RecordDate time.Time `json:"record_date"`
32}
33
34type RecordMP struct {
35 RecordID int `json:"record_id"`
36 HostID string `json:"host_id"`
37 PartnerID string `json:"partner_id"`
38 ScoreCount int `json:"score_count"`
39 ScoreTime int `json:"score_time"`
40 HostDemoID string `json:"host_demo_id"`
41 PartnerDemoID string `json:"partner_demo_id"`
42 RecordDate time.Time `json:"record_date"`
43}
44
45type RecordRequest struct {
17 ScoreCount int `json:"score_count" form:"score_count" binding:"required"` 46 ScoreCount int `json:"score_count" form:"score_count" binding:"required"`
18 ScoreTime int `json:"score_time" form:"score_time" binding:"required"` 47 ScoreTime int `json:"score_time" form:"score_time" binding:"required"`
19 PartnerID string `json:"partner_id" form:"partner_id" binding:"required"` 48 PartnerID string `json:"partner_id" form:"partner_id" binding:"required"`
20 IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange" binding:"required"` 49 IsPartnerOrange bool `json:"is_partner_orange" form:"is_partner_orange" binding:"required"`
21 //Demos []*multipart.FileHeader `form:"demos[]" binding:"required"`
22} 50}
diff --git a/backend/routes/routes.go b/backend/routes/routes.go
index 43dfd65..b872b77 100644
--- a/backend/routes/routes.go
+++ b/backend/routes/routes.go
@@ -19,6 +19,7 @@ func InitRoutes(router *gin.Engine) {
19 v1.PUT("/profile", middleware.CheckAuth, controllers.UpdateCountryCode) 19 v1.PUT("/profile", middleware.CheckAuth, controllers.UpdateCountryCode)
20 v1.GET("/user/:id", middleware.CheckAuth, controllers.FetchUser) 20 v1.GET("/user/:id", middleware.CheckAuth, controllers.FetchUser)
21 v1.GET("/demo", controllers.DownloadDemoWithID) 21 v1.GET("/demo", controllers.DownloadDemoWithID)
22 v1.GET("/maps/:id", middleware.CheckAuth, controllers.FetchMap)
22 v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo) 23 v1.POST("/maps/:id/record", middleware.CheckAuth, controllers.CreateRecordWithDemo)
23 } 24 }
24} 25}