diff --git a/server/handler/applicants.go b/server/handler/applicants.go index b0d77ae..0a41ee2 100644 --- a/server/handler/applicants.go +++ b/server/handler/applicants.go @@ -1,6 +1,7 @@ package handler import ( + "fmt" "net/http" "github.com/google/uuid" @@ -32,7 +33,7 @@ func (h *Handler) GetEventsEventIDApplicants(ctx echo.Context, eventID api.Event res := make(api.GetEventApplicantsResponse, 0, len(dateOptions)) for traQID, dateIDs := range dateOptions { res = append(res, api.Applicant{ - TraqID: &traQID, + TraqID: &traQID, DateOptionIDs: &dateIDs, }) } @@ -45,24 +46,36 @@ func (h *Handler) PostEventsEventIDApplicants(ctx echo.Context, eventID api.Even if err := ctx.Bind(&req); err != nil { return echo.NewHTTPError(http.StatusBadRequest, err) } + if len(*req.DateOptionIDs) == 0 { + return ctx.NoContent(http.StatusOK) + } + // eventIDがeventDateIDのそれぞれの値が齟齬がないか確認 + err := h.repo.ValidateEventDateIDsFromEventID(eventID, *req.DateOptionIDs) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("invalid event ID and DateOptionIDs: %v", err)) + } + + traQID := ctx.Get(traQIDKey).(string) - dateVotes := []model.DateVote{} + // traqIDがeventDateIDのそれぞれの値が齟齬がないか確認 + err = h.repo.ValidateEventDateIDsFromTraqID(traQID, *req.DateOptionIDs) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("already exists traqID and DateOptionIDs: %v", err)) + } + + dateVotes := make([]model.DateVote, 0, len(*req.DateOptionIDs)) for _, dateOption := range *req.DateOptionIDs { id, err := uuid.NewV7() if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, err) } - - traQID := ctx.Get(traQIDKey).(string) dateVotes = append(dateVotes, model.DateVote{ - ID: id, - EventID: eventID, - TraQID: traQID, - DateID: dateOption, + ID: id, + TraQID: traQID, + DateID: dateOption, }) } - - err := h.repo.CreateDateVotes(dateVotes) + err = h.repo.CreateDateVotes(dateVotes) if err != nil { return echo.NewHTTPError(http.StatusInternalServerError, err) } diff --git a/server/model/date_vote.go b/server/model/date_vote.go index ba62604..018d9b9 100644 --- a/server/model/date_vote.go +++ b/server/model/date_vote.go @@ -8,7 +8,6 @@ import ( type DateVote struct { ID uuid.UUID `db:"id"` - EventID uuid.UUID `db:"event_id"` TraQID string `db:"traq_id"` DateID uuid.UUID `db:"event_date_id"` CreatedAt time.Time `db:"created_at"` @@ -38,6 +37,6 @@ func (repo *Repository) CreateDateVotes(votes []DateVote) error { if err != nil { return err } - + return tx.Commit() } diff --git a/server/model/event_date.go b/server/model/event_date.go index 001999f..7dc5b80 100644 --- a/server/model/event_date.go +++ b/server/model/event_date.go @@ -1,9 +1,12 @@ package model import ( + "fmt" + "log" "time" "github.com/google/uuid" + "github.com/jmoiron/sqlx" ) type EventDate struct { @@ -38,3 +41,38 @@ func (repo *Repository) CreateEventDates(dates []EventDate) error { return tx.Commit() } + +func (repo *Repository) ValidateEventDateIDsFromEventID(eventID uuid.UUID, dateIDs []uuid.UUID) error { + var count int + query, args, err := sqlx.In("SELECT COUNT(*) FROM event_dates WHERE event_id = ? AND id IN (?)", eventID, dateIDs) + if err != nil { + log.Println("Error creating SQL query") + return err + } + err = repo.db.Get(&count, query, args...) + if err != nil { + log.Println("Error getting count from event_dates") + return err + } + if count != len(dateIDs) { + return fmt.Errorf("invalid date IDs: %v", dateIDs) + } + return nil +} + +func (repo *Repository) ValidateEventDateIDsFromTraqID(traQID string, dateIDs []uuid.UUID) error { + // すでにtraQIDとdateIDsの組み合わせが存在するか確認 + var count int + query, args, err := sqlx.In("SELECT COUNT(*) FROM date_votes WHERE traq_id = ? AND event_date_id IN (?)", traQID, dateIDs) + if err != nil { + return err + } + err = repo.db.Get(&count, query, args...) + if err != nil { + return err + } + if count > 0 { + return fmt.Errorf("invalid date IDs: %v", dateIDs) + } + return nil +}