diff options
Diffstat (limited to 'api/handlers')
| -rw-r--r-- | api/handlers/auth.go | 11 | ||||
| -rw-r--r-- | api/handlers/conference.go | 103 | ||||
| -rw-r--r-- | api/handlers/favourites.go | 19 | ||||
| -rw-r--r-- | api/handlers/schedule.go | 26 |
4 files changed, 120 insertions, 39 deletions
diff --git a/api/handlers/auth.go b/api/handlers/auth.go index c19fc3a..7b0a4c8 100644 --- a/api/handlers/auth.go +++ b/api/handlers/auth.go @@ -34,23 +34,18 @@ func Login(authService auth.Service, store session.Service) http.HandlerFunc { } // TODO X-Forwarded-For - session, err := store.Create(user.ID, user.Username, r.RemoteAddr, r.UserAgent()) + session, err := store.Create(user.ID, user.Username, r.RemoteAddr, r.UserAgent(), user.Admin) if err != nil { return err } - cookie := &http.Cookie{ - Name: "confplanner_session", - Value: session.Token, - Path: "/api", - } - http.SetCookie(w, cookie) - return &dto.OkResponse{ Code: http.StatusOK, Data: &dto.LoginResponse{ ID: user.ID, + Token: session.Token, Username: user.Username, + Admin: session.Admin, }, } }) diff --git a/api/handlers/conference.go b/api/handlers/conference.go new file mode 100644 index 0000000..42cbfc1 --- /dev/null +++ b/api/handlers/conference.go @@ -0,0 +1,103 @@ +package handlers + +import ( + "errors" + "net/http" + "strconv" + + "github.com/LMBishop/confplanner/api/dto" + "github.com/LMBishop/confplanner/pkg/conference" + "github.com/golang-cz/nilslice" +) + +func GetSchedule(service conference.Service) http.HandlerFunc { + return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + conferenceID, err := strconv.Atoi(r.PathValue("id")) + if err != nil { + return &dto.ErrorResponse{ + Code: http.StatusBadRequest, + Message: "Bad conference ID", + } + } + + schedule, lastUpdated, err := service.GetSchedule(int32(conferenceID)) + if err != nil { + return err + } + + return &dto.OkResponse{ + Code: http.StatusOK, + Data: &dto.GetScheduleResponse{ + Schedule: nilslice.Initialize(*schedule), + LastUpdated: lastUpdated, + }, + } + }) +} + +func GetConferences(service conference.Service) http.HandlerFunc { + return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + conferences, err := service.GetConferences() + if err != nil { + return err + } + + var conferencesResponse []*dto.ConferenceResponse + for _, c := range conferences { + conference := &dto.ConferenceResponse{} + conference.Scan(c) + conferencesResponse = append(conferencesResponse, conference) + } + + return &dto.OkResponse{ + Code: http.StatusOK, + Data: conferencesResponse, + } + }) +} + +func CreateConference(service conference.Service) http.HandlerFunc { + return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + var request dto.CreateConferenceRequest + if err := dto.ReadDto(r, &request); err != nil { + return err + } + + createdConference, err := service.CreateConference(request.URL) + if err != nil { + if errors.Is(err, conference.ErrScheduleFetch) { + return &dto.ErrorResponse{ + Code: http.StatusBadRequest, + Message: "Could not fetch schedule from URL (is it a valid pentabarf XML file?)", + } + } + return err + } + + var response dto.ConferenceResponse + response.Scan(*createdConference) + return &dto.OkResponse{ + Code: http.StatusCreated, + Data: response, + } + }) +} + +func DeleteConference(service conference.Service) http.HandlerFunc { + return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + var request dto.DeleteConferenceRequest + if err := dto.ReadDto(r, &request); err != nil { + return err + } + + err := service.DeleteConference(request.ID) + if err != nil { + return err + } + + return &dto.OkResponse{ + Code: http.StatusOK, + Data: nil, + } + }) +} diff --git a/api/handlers/favourites.go b/api/handlers/favourites.go index 502cb43..d5fe8c3 100644 --- a/api/handlers/favourites.go +++ b/api/handlers/favourites.go @@ -2,6 +2,7 @@ package handlers import ( "net/http" + "strconv" "github.com/LMBishop/confplanner/api/dto" "github.com/LMBishop/confplanner/pkg/favourites" @@ -16,7 +17,7 @@ func CreateFavourite(service favourites.Service) http.HandlerFunc { return err } - if request.GUID == nil && request.ID == nil { + if request.GUID == nil && request.EventID == nil { return &dto.ErrorResponse{ Code: http.StatusBadRequest, Message: "One of event GUID or event ID must be specified", @@ -34,7 +35,7 @@ func CreateFavourite(service favourites.Service) http.HandlerFunc { } } - createdFavourite, err := service.CreateFavouriteForUser(session.UserID, uuid, request.ID) + createdFavourite, err := service.CreateFavouriteForUser(session.UserID, uuid, request.EventID, request.ConferenceID) if err != nil { return err } @@ -50,9 +51,17 @@ func CreateFavourite(service favourites.Service) http.HandlerFunc { func GetFavourites(service favourites.Service) http.HandlerFunc { return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { + conferenceID, err := strconv.Atoi(r.PathValue("id")) + if err != nil { + return &dto.ErrorResponse{ + Code: http.StatusBadRequest, + Message: "Bad conference ID", + } + } + session := r.Context().Value("session").(*session.UserSession) - favourites, err := service.GetFavouritesForUser(session.UserID) + favourites, err := service.GetFavouritesForUserConference(session.UserID, int32(conferenceID)) if err != nil { return err } @@ -79,7 +88,7 @@ func DeleteFavourite(service favourites.Service) http.HandlerFunc { return err } - if request.GUID == nil && request.ID == nil { + if request.GUID == nil && request.EventID == nil { return &dto.ErrorResponse{ Code: http.StatusBadRequest, Message: "One of event GUID or event ID must be specified", @@ -96,7 +105,7 @@ func DeleteFavourite(service favourites.Service) http.HandlerFunc { } } - err = service.DeleteFavouriteForUserByEventDetails(session.UserID, uuid, request.ID) + err = service.DeleteFavouriteForUserByEventDetails(session.UserID, uuid, request.EventID, request.ConferenceID) if err != nil { if err == favourites.ErrNotFound { return &dto.ErrorResponse{ diff --git a/api/handlers/schedule.go b/api/handlers/schedule.go deleted file mode 100644 index 061e6f9..0000000 --- a/api/handlers/schedule.go +++ /dev/null @@ -1,26 +0,0 @@ -package handlers - -import ( - "net/http" - - "github.com/LMBishop/confplanner/api/dto" - "github.com/LMBishop/confplanner/pkg/schedule" - "github.com/golang-cz/nilslice" -) - -func GetSchedule(service schedule.Service) http.HandlerFunc { - return dto.WrapResponseFunc(func(w http.ResponseWriter, r *http.Request) error { - schedule, lastUpdated, err := service.GetSchedule() - if err != nil { - return err - } - - return &dto.OkResponse{ - Code: http.StatusOK, - Data: &dto.GetScheduleResponse{ - Schedule: nilslice.Initialize(*schedule), - LastUpdated: lastUpdated, - }, - } - }) -} |
