1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
|
package controllers
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"github.com/pektezol/leastportals/backend/database"
"github.com/pektezol/leastportals/backend/models"
)
// GET Map
//
// @Summary Get map page with specified id.
// @Tags maps
// @Accept json
// @Produce json
// @Param id path int true "Map ID"
// @Success 200 {object} models.Response{data=models.Map}
// @Failure 400 {object} models.Response
// @Router /maps/{id} [get]
func FetchMap(c *gin.Context) {
id := c.Param("id")
// Get map data
var mapData models.Map
var isDisabled bool
intID, err := strconv.Atoi(id)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
return
}
mapData.ID = intID
sql := `SELECT map_name, wr_score, wr_time, is_coop, is_disabled FROM maps WHERE id = $1;`
err = database.DB.QueryRow(sql, id).Scan(&mapData.Name, &mapData.ScoreWR, &mapData.TimeWR, &mapData.IsCoop, &isDisabled)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
return
}
if isDisabled {
c.JSON(http.StatusBadRequest, models.ErrorResponse("Map is not available for competitive boards."))
return
}
// Get records from the map
if mapData.IsCoop {
var records []models.RecordMP
sql = `SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date
FROM (
SELECT id, host_id, partner_id, score_count, score_time, host_demo_id, partner_demo_id, record_date,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY score_count, score_time) AS rn
FROM records_mp
WHERE map_id = $1
) sub
WHERE rn = 1;`
rows, err := database.DB.Query(sql, id)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
return
}
placement := 1
ties := 0
for rows.Next() {
var record models.RecordMP
err := rows.Scan(&record.RecordID, &record.HostID, &record.PartnerID, &record.ScoreCount, &record.ScoreTime, &record.HostDemoID, &record.PartnerDemoID, &record.RecordDate)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
return
}
if len(records) != 0 && records[len(records)-1].ScoreTime == record.ScoreTime {
ties++
record.Placement = placement - ties
} else {
record.Placement = placement
}
records = append(records, record)
placement++
}
mapData.Records = records
} else {
var records []models.RecordSP
sql = `SELECT id, user_id, score_count, score_time, demo_id, record_date
FROM (
SELECT id, user_id, score_count, score_time, demo_id, record_date,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY score_count, score_time) AS rn
FROM records_sp
WHERE map_id = $1
) sub
WHERE rn = 1;`
rows, err := database.DB.Query(sql, id)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
return
}
placement := 1
ties := 0
for rows.Next() {
var record models.RecordSP
err := rows.Scan(&record.RecordID, &record.UserID, &record.ScoreCount, &record.ScoreTime, &record.DemoID, &record.RecordDate)
if err != nil {
c.JSON(http.StatusBadRequest, models.ErrorResponse(err.Error()))
return
}
if len(records) != 0 && records[len(records)-1].ScoreTime == record.ScoreTime {
ties++
record.Placement = placement - ties
} else {
record.Placement = placement
}
records = append(records, record)
placement++
}
mapData.Records = records
}
// Return response
c.JSON(http.StatusOK, models.Response{
Success: true,
Message: "Successfully retrieved map data.",
Data: mapData,
})
}
func CreateMapCommunity(c *gin.Context) {
}
|