Skip to content

Commit 9a4c3d8

Browse files
new get space create endpoint and fix issue in put space fields
1 parent 3a800b4 commit 9a4c3d8

File tree

6 files changed

+71
-77
lines changed

6 files changed

+71
-77
lines changed

api/admin_create_event.go

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ func (h *ApiHandler) AdminCreateEvent(gc *gin.Context) {
132132
return
133133
}
134134
}
135-
debugf("AdminCreateEvent 3")
136135

137136
// Validation
138137
validationErr := payload.Validate()
@@ -147,7 +146,6 @@ func (h *ApiHandler) AdminCreateEvent(gc *gin.Context) {
147146
}
148147

149148
var newEventId int
150-
debugf("AdminCreateEvent 4")
151149

152150
txErr := WithTransaction(ctx, h.DbPool, func(tx pgx.Tx) *ApiTxError {
153151
txErr := h.CheckOrganizationAllPermissions(
@@ -309,7 +307,6 @@ func (h *ApiHandler) AdminCreateEvent(gc *gin.Context) {
309307
apiRequest.Error(txErr.Code, txErr.Error())
310308
return
311309
}
312-
debugf("AdminCreateEvent 5")
313310

314311
apiRequest.Metadata["created_event_id"] = newEventId
315312
apiRequest.SuccessNoData(http.StatusCreated, "")

api/admin_create_space.go

Lines changed: 39 additions & 56 deletions
Original file line numberDiff line numberDiff line change
@@ -6,78 +6,61 @@ import (
66
"strings"
77

88
"github.com/gin-gonic/gin"
9+
"github.com/jackc/pgx/v5"
10+
"github.com/sndcds/grains/grains_api"
11+
"github.com/sndcds/uranus/app"
912
)
1013

11-
// TODO: Review code
12-
1314
func (h *ApiHandler) AdminCreateSpace(gc *gin.Context) {
1415
ctx := gc.Request.Context()
16+
userId := h.userId(gc)
17+
apiRequest := grains_api.NewRequest(gc, "admin-create-space")
1518

16-
type UpdateRequest struct {
17-
VenueId int `json:"venue_id"`
18-
Name *string `json:"name"`
19-
Description *string `json:"description"`
20-
SpaceTypeId int `json:"space_type_id"`
21-
BuildingLevel int `json:"building_level"`
22-
TotalCapacity int `json:"total_capacity"`
23-
SeatingCapacity int `json:"seating_capacity"`
24-
WebsiteLink *string `json:"website_link"`
25-
AccessibilityFlags int64 `json:"accessibility_flags"`
26-
AccessibilitySummary *string `json:"accessibility_summary"`
19+
type Payload struct {
20+
OrganizationId int `json:"organization_id" binding:"required"`
21+
VenueId int `json:"venue_id" binding:"required"`
22+
SpaceName string `json:"space_name" binding:"required"`
2723
}
28-
29-
// TODO: Check permissions by user and OrganizationId
30-
31-
var req UpdateRequest
32-
if err := gc.ShouldBindJSON(&req); err != nil {
33-
gc.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
24+
payload, ok := grains_api.DecodeJSONBody[Payload](gc, apiRequest)
25+
if !ok {
3426
return
3527
}
3628

37-
// Begin transaction
38-
tx, err := h.DbPool.Begin(gc)
39-
if err != nil {
40-
gc.JSON(http.StatusInternalServerError, gin.H{"error": "failed to start transaction"})
29+
spaceName := strings.TrimSpace(payload.SpaceName)
30+
if spaceName == "" {
31+
apiRequest.Error(http.StatusBadRequest, "space_name cannot be empty")
4132
return
4233
}
43-
defer func() { _ = tx.Rollback(ctx) }()
4434

45-
var newId int
46-
insertSpaceQuery := `
47-
INSERT INTO {{schema}}.space
48-
(venue_id, name, description, space_type_id, building_level, total_capacity, seating_capacity, website_link, accessibility_flags, accessibility_summary)
49-
VALUES
50-
($1, $2, $3, $4, $5, $6, $7, $8, $9, $10)
51-
RETURNING id
52-
`
53-
insertSpaceQuery = strings.Replace(insertSpaceQuery, "{{schema}}", h.DbSchema, 1)
35+
apiRequest.Metadata["prganization_id"] = payload.OrganizationId
36+
apiRequest.Metadata["venue_id"] = payload.VenueId
37+
apiRequest.Metadata["space_name"] = spaceName
5438

55-
err = tx.QueryRow(gc, insertSpaceQuery,
56-
req.VenueId,
57-
req.Name,
58-
req.Description,
59-
req.SpaceTypeId,
60-
req.BuildingLevel,
61-
req.TotalCapacity,
62-
req.SeatingCapacity,
63-
req.WebsiteLink,
64-
req.AccessibilityFlags,
65-
req.AccessibilitySummary,
66-
).Scan(&newId)
39+
txErr := WithTransaction(ctx, h.DbPool, func(tx pgx.Tx) *ApiTxError {
6740

68-
if err != nil {
69-
gc.JSON(http.StatusBadRequest, gin.H{"error": fmt.Sprintf("insert space failed: %v", err)})
70-
return
71-
}
41+
txErr := h.CheckOrganizationAllPermissions(
42+
gc, tx, userId, payload.OrganizationId,
43+
app.PermAddSpace)
44+
if txErr != nil {
45+
return txErr
46+
}
7247

73-
// Commit transaction
74-
if err = tx.Commit(gc); err != nil {
75-
gc.JSON(http.StatusInternalServerError, gin.H{"error": "failed to commit transaction"})
48+
newSpaceId := -1
49+
query := fmt.Sprintf(`INSERT INTO %s.space (venue_id, name) VALUES ($1, $2) RETURNING id`, h.DbSchema)
50+
err := tx.QueryRow(ctx, query, payload.VenueId, spaceName).Scan(&newSpaceId)
51+
if err != nil {
52+
return &ApiTxError{
53+
Code: http.StatusInternalServerError,
54+
Err: fmt.Errorf("Internal server error"),
55+
}
56+
}
57+
apiRequest.Metadata["space_id"] = newSpaceId
58+
return nil
59+
})
60+
if txErr != nil {
61+
apiRequest.Error(txErr.Code, txErr.Error())
7662
return
7763
}
7864

79-
gc.JSON(http.StatusOK, gin.H{
80-
"id": newId,
81-
"message": "Space created successfully",
82-
})
65+
apiRequest.SuccessNoData(http.StatusOK, "space successfully created")
8366
}

api/admin_create_venue.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
func (h *ApiHandler) AdminCreateVenue(gc *gin.Context) {
1515
ctx := gc.Request.Context()
1616
userId := h.userId(gc)
17-
apiRequest := grains_api.NewRequest(gc, "create-venue")
17+
apiRequest := grains_api.NewRequest(gc, "admin-create-venue")
1818

1919
type Payload struct {
2020
OrganizationId int `json:"organization_id" binding:"required"`

api/admin_update_event_fields.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package api
22

33
import (
4+
"encoding/json"
45
"fmt"
56
"net/http"
67
"strings"
@@ -39,12 +40,22 @@ func (h *ApiHandler) UpdateEventFields(gc *gin.Context) {
3940
MaxPrice NullableField[float64] `json:"max_price"`
4041
Currency NullableField[string] `json:"currency"`
4142
TicketFlags *[]string `json:"ticket_flags"`
43+
VisitorInfoFlags NullableField[string] `json:"visitor_info_flags"`
4244
}
4345

46+
decoder := json.NewDecoder(gc.Request.Body)
47+
decoder.DisallowUnknownFields()
48+
if err := decoder.Decode(&payload); err != nil {
49+
apiRequest.PayloadError()
50+
return
51+
}
52+
53+
/* Former version
4454
if err := gc.ShouldBindJSON(&payload); err != nil {
4555
apiRequest.PayloadError()
4656
return
4757
}
58+
*/
4859

4960
setClauses := []string{}
5061
args := []interface{}{}
@@ -67,6 +78,7 @@ func (h *ApiHandler) UpdateEventFields(gc *gin.Context) {
6778
argPos = addUpdateClauseNullable("max_price", payload.MaxPrice, &setClauses, &args, argPos)
6879
argPos = addUpdateClauseNullable("currency", payload.Currency, &setClauses, &args, argPos)
6980
argPos = addUpdateClauseStringSliceField("ticket_flags", payload.TicketFlags, &setClauses, &args, argPos)
81+
argPos = addUpdateClauseNullable("visitor_info_flags", payload.VisitorInfoFlags, &setClauses, &args, argPos)
7082

7183
if len(setClauses) == 0 {
7284
apiRequest.SuccessNoData(http.StatusOK, "no fields updated")

api/admin_update_space_fields.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -22,22 +22,22 @@ func (h *ApiHandler) UpdateSpaceFields(gc *gin.Context) {
2222
apiRequest.SetMeta("space_id", spaceId)
2323

2424
var payload struct {
25-
Name NullableField[string] `json:"name"`
26-
Description NullableField[string] `json:"description"`
27-
TotalCapacity NullableField[int] `json:"total_capacity"`
28-
SeatingCapacity NullableField[int] `json:"seating_capacity"`
29-
SpaceType NullableField[string] `json:"space_type"`
30-
BuildingLevel NullableField[int] `json:"building_level"`
31-
WebsiteLink NullableField[string] `json:"website_link"`
32-
AccessibilitySummary NullableField[string] `json:"accessibility_summary"`
33-
AccessibilityFlags NullableField[string] `json:"accessibility_flags"`
34-
AreaSqm NullableField[int] `json:"area_sqm"`
35-
EnvironmentalFeatures NullableField[int64] `json:"environmental_features"`
36-
AudioFeatures NullableField[int64] `json:"audio_features"`
37-
PresentationFeatures NullableField[int64] `json:"presentation_features"`
38-
LightingFeatures NullableField[int64] `json:"lighting_features"`
39-
ClimateFeatures NullableField[int64] `json:"climate_features"`
40-
MiscFeatures NullableField[int64] `json:"misc_features"`
25+
Name NullableField[string] `json:"name"`
26+
Description NullableField[string] `json:"description"`
27+
TotalCapacity NullableField[int] `json:"total_capacity"`
28+
SeatingCapacity NullableField[int] `json:"seating_capacity"`
29+
SpaceType NullableField[string] `json:"space_type"`
30+
BuildingLevel NullableField[int] `json:"building_level"`
31+
WebsiteLink NullableField[string] `json:"website_link"`
32+
AccessibilitySummary NullableField[string] `json:"accessibility_summary"`
33+
AccessibilityFlags NullableField[string] `json:"accessibility_flags"`
34+
AreaSqm NullableField[float64] `json:"area_sqm"`
35+
EnvironmentalFeatures NullableField[int64] `json:"environmental_features"`
36+
AudioFeatures NullableField[int64] `json:"audio_features"`
37+
PresentationFeatures NullableField[int64] `json:"presentation_features"`
38+
LightingFeatures NullableField[int64] `json:"lighting_features"`
39+
ClimateFeatures NullableField[int64] `json:"climate_features"`
40+
MiscFeatures NullableField[int64] `json:"misc_features"`
4141
}
4242

4343
if err := gc.ShouldBindJSON(&payload); err != nil {

uranus-api.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -196,10 +196,12 @@ func main() {
196196

197197
// Space
198198
adminRoute.GET("/space/:spaceId", apiHandler.AdminGetSpace)
199+
adminRoute.POST("/space/create", apiHandler.AdminCreateSpace)
200+
adminRoute.PUT("/space/:spaceId/fields", apiHandler.UpdateSpaceFields)
201+
199202
adminRoute.PUT("/space", apiHandler.AdminUpsertSpace) // TODO: check!
200203
adminRoute.PUT("/space/:spaceId", apiHandler.AdminUpsertSpace) // TODO: check!
201204
adminRoute.DELETE("/space/:spaceId", apiHandler.AdminDeleteSpace) // TODO: check!
202-
adminRoute.PUT("/space/:spaceId/fields", apiHandler.UpdateSpaceFields)
203205

204206
// Event
205207
adminRoute.GET("/event/:eventId", apiHandler.AdminGetEvent)

0 commit comments

Comments
 (0)