Skip to content

Commit a20e5d4

Browse files
add get api/event/get_choosable_release_states
1 parent 9a4c3d8 commit a20e5d4

File tree

3 files changed

+117
-48
lines changed

3 files changed

+117
-48
lines changed

api/get_choosable_release_states.go

Lines changed: 0 additions & 47 deletions
This file was deleted.
Lines changed: 115 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,115 @@
1+
package api
2+
3+
import (
4+
"fmt"
5+
"net/http"
6+
"sort"
7+
"strings"
8+
9+
"github.com/gin-gonic/gin"
10+
"github.com/sndcds/grains/grains_api"
11+
)
12+
13+
// EventReleaseStatusOption represents a single key/name pair
14+
type EventReleaseStatusOption struct {
15+
Key string `json:"key"`
16+
Name string `json:"name"`
17+
}
18+
19+
// GetEventReleaseStatusI18n handles /api/event-release-status-i18n
20+
func (h *ApiHandler) GetEventReleaseStatusI18n(gc *gin.Context) {
21+
ctx := gc.Request.Context()
22+
apiRequest := grains_api.NewRequest(gc, "event-release-status-i18n")
23+
24+
// Get lang query param, default to "en"
25+
langParam := gc.DefaultQuery("lang", "en")
26+
langs := strings.Split(langParam, ",") // e.g., "de,da,en"
27+
apiRequest.SetMeta("languages", strings.Join(langs, ","))
28+
29+
// Prepare placeholders for SQL: $1,$2,...
30+
args := make([]string, len(langs))
31+
placeholders := make([]string, len(langs))
32+
for i, l := range langs {
33+
args[i] = l
34+
placeholders[i] = fmt.Sprintf("$%d", i+1)
35+
}
36+
37+
// SQL query: fetch all statuses + order for requested languages
38+
query := fmt.Sprintf(`
39+
SELECT iso_639_1, key, name, "order"
40+
FROM %s.event_release_status_i18n
41+
WHERE iso_639_1 IN (%s)
42+
ORDER BY iso_639_1, "order"`,
43+
h.DbSchema, strings.Join(placeholders, ","))
44+
45+
// Convert []string to []interface{} for Query args
46+
queryArgs := make([]interface{}, len(args))
47+
for i, v := range args {
48+
queryArgs[i] = v
49+
}
50+
51+
rows, err := h.DbPool.Query(ctx, query, queryArgs...)
52+
if err != nil {
53+
debugf("Error in GetEventReleaseStatusI18n: %s", err.Error())
54+
apiRequest.DatabaseError()
55+
return
56+
}
57+
defer rows.Close()
58+
59+
// Build i18n map and order map
60+
i18n := make(map[string]map[string]string)
61+
orderMap := make(map[string]int) // key -> order
62+
63+
for rows.Next() {
64+
var iso, key, name string
65+
var order int
66+
if err := rows.Scan(&iso, &key, &name, &order); err != nil {
67+
debugf("Error scanning row: %s", err.Error())
68+
apiRequest.DatabaseError()
69+
return
70+
}
71+
72+
// Build i18n
73+
if _, ok := i18n[iso]; !ok {
74+
i18n[iso] = make(map[string]string)
75+
}
76+
i18n[iso][key] = name
77+
78+
// Capture order (once per key, same across languages)
79+
if _, exists := orderMap[key]; !exists {
80+
orderMap[key] = order
81+
}
82+
}
83+
84+
if err := rows.Err(); err != nil {
85+
debugf("Rows error: %s", err.Error())
86+
apiRequest.DatabaseError()
87+
return
88+
}
89+
90+
// Generate ordered keys slice
91+
keyOrders := make([]struct {
92+
Key string
93+
Order int
94+
}, 0, len(orderMap))
95+
for k, o := range orderMap {
96+
keyOrders = append(keyOrders, struct {
97+
Key string
98+
Order int
99+
}{k, o})
100+
}
101+
sort.Slice(keyOrders, func(i, j int) bool {
102+
return keyOrders[i].Order < keyOrders[j].Order
103+
})
104+
orderSlice := make([]string, 0, len(keyOrders))
105+
for _, ko := range keyOrders {
106+
orderSlice = append(orderSlice, ko.Key)
107+
}
108+
109+
// Return JSON using grains_api pattern
110+
response := map[string]interface{}{
111+
"i18n": i18n,
112+
"order": orderSlice,
113+
}
114+
apiRequest.Success(http.StatusOK, response, "")
115+
}

uranus-api.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,8 @@ func main() {
9696
// Public endpoints
9797
publicRoute := router.Group("/api")
9898

99+
publicRoute.GET("/event/release-status-i18n", apiHandler.GetEventReleaseStatusI18n)
100+
99101
publicRoute.GET("/events", apiHandler.GetEvents) // TODO: check!
100102
publicRoute.GET("/events/type-summary", apiHandler.GetEventTypeSummary) // TODO: check!
101103
publicRoute.GET("/events/venue-summary", apiHandler.GetEventVenueSummary) // TODO: check!
@@ -112,7 +114,6 @@ func main() {
112114

113115
publicRoute.GET("/event/type-genre-lookup", apiHandler.GetEventTypeGenreLookup)
114116

115-
publicRoute.GET("/choosable-release-states", apiHandler.GetChoosableReleaseStates) // TODO: check!
116117
publicRoute.GET("/choosable-link-types", apiHandler.GetChoosableLinkTypes)
117118
publicRoute.GET("/choosable-venue-types", apiHandler.GetChoosableVenueTypes)
118119
publicRoute.GET("/choosable-space-types", apiHandler.GetChoosableSpaceTypes)

0 commit comments

Comments
 (0)