From f5e632a46f0812c82680cb01ed18b1a9725ef1b3 Mon Sep 17 00:00:00 2001 From: Vojtech Mares Date: Mon, 13 May 2024 12:55:13 +0200 Subject: [PATCH] feat: add endpoints to update payment and attendance status of training date attendee --- api/v1/openapi.yaml | 76 ++++++++ internal/server/api.gen.go | 348 +++++++++++++++++++++++++++++++++---- internal/server/api.go | 168 ++++++++++++++++++ 3 files changed, 555 insertions(+), 37 deletions(-) diff --git a/api/v1/openapi.yaml b/api/v1/openapi.yaml index ca067c5..08bb0e7 100644 --- a/api/v1/openapi.yaml +++ b/api/v1/openapi.yaml @@ -386,6 +386,66 @@ paths: "500": $ref: "#/components/responses/InternalError" + /v1/trainings/{trainingID}/dates/{trainingDateID}/attendees/{trainingDateAttendeeID}/paid: + put: + summary: Update status of a training date attendee payment + operationId: updateTrainingDateAttendeePayment + tags: + - Trainings + parameters: + - $ref: "#/components/parameters/TrainingID" + - $ref: "#/components/parameters/TrainingDateID" + - $ref: "#/components/parameters/TrainingDateAttendeeID" + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/TrainingDateAttendeePaymentUpdateRequest" + responses: + "200": + description: Training date attendee payment status updated + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateTrainingDateAttendeeResponse" + "400": + $ref: "#/components/responses/InvalidInputError" + "404": + $ref: "#/components/responses/NotFoundError" + "500": + $ref: "#/components/responses/InternalError" + + /v1/trainings/{trainingID}/dates/{trainingDateID}/attendees/{trainingDateAttendeeID}/attended: + put: + summary: Update status of a training date attendee attendance + operationId: updateTrainingDateAttendeeAttendance + tags: + - Trainings + parameters: + - $ref: "#/components/parameters/TrainingID" + - $ref: "#/components/parameters/TrainingDateID" + - $ref: "#/components/parameters/TrainingDateAttendeeID" + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/TrainingDateAttendeeAttendanceUpdateRequest" + responses: + "200": + description: Training date attendee attendance status updated + content: + application/json: + schema: + $ref: "#/components/schemas/UpdateTrainingDateAttendeeResponse" + "400": + $ref: "#/components/responses/InvalidInputError" + "404": + $ref: "#/components/responses/NotFoundError" + "500": + $ref: "#/components/responses/InternalError" + /v1/trainings/{trainingID}/dates/{trainingDateID}/attendees/count: get: summary: Get a training date attendee count @@ -630,6 +690,22 @@ components: required: - count + TrainingDateAttendeePaymentUpdateRequest: + type: object + properties: + paid: + type: boolean + required: + - paid + + TrainingDateAttendeeAttendanceUpdateRequest: + type: object + properties: + attended: + type: boolean + required: + - attended + TrainingDateAttendeeID: type: string format: uuid diff --git a/internal/server/api.gen.go b/internal/server/api.gen.go index a09e85a..427d780 100644 --- a/internal/server/api.gen.go +++ b/internal/server/api.gen.go @@ -168,9 +168,19 @@ type TrainingDateAttendee struct { Position string `json:"position"` } +// TrainingDateAttendeeAttendanceUpdateRequest defines model for TrainingDateAttendeeAttendanceUpdateRequest. +type TrainingDateAttendeeAttendanceUpdateRequest struct { + Attended bool `json:"attended"` +} + // TrainingDateAttendeeID defines model for TrainingDateAttendeeID. type TrainingDateAttendeeID = training.TrainingDateAttendeeID +// TrainingDateAttendeePaymentUpdateRequest defines model for TrainingDateAttendeePaymentUpdateRequest. +type TrainingDateAttendeePaymentUpdateRequest struct { + Paid bool `json:"paid"` +} + // TrainingDateID defines model for TrainingDateID. type TrainingDateID = training.TrainingDateID @@ -232,6 +242,12 @@ type CreateTrainingDateAttendeeJSONRequestBody = CreateTrainingDateAttendeeReque // UpdateTrainingDateAttendeeJSONRequestBody defines body for UpdateTrainingDateAttendee for application/json ContentType. type UpdateTrainingDateAttendeeJSONRequestBody = UpdateTrainingDateAttendeeRequest +// UpdateTrainingDateAttendeeAttendanceJSONRequestBody defines body for UpdateTrainingDateAttendeeAttendance for application/json ContentType. +type UpdateTrainingDateAttendeeAttendanceJSONRequestBody = TrainingDateAttendeeAttendanceUpdateRequest + +// UpdateTrainingDateAttendeePaymentJSONRequestBody defines body for UpdateTrainingDateAttendeePayment for application/json ContentType. +type UpdateTrainingDateAttendeePaymentJSONRequestBody = TrainingDateAttendeePaymentUpdateRequest + // ServerInterface represents all server handlers. type ServerInterface interface { // List all trainings @@ -285,6 +301,12 @@ type ServerInterface interface { // Update a training date attendee by ID // (PUT /v1/trainings/{trainingID}/dates/{trainingDateID}/attendees/{trainingDateAttendeeID}) UpdateTrainingDateAttendee(c *fiber.Ctx, trainingID TrainingID, trainingDateID TrainingDateID, trainingDateAttendeeID TrainingDateAttendeeID) error + // Update status of a training date attendee attendance + // (PUT /v1/trainings/{trainingID}/dates/{trainingDateID}/attendees/{trainingDateAttendeeID}/attended) + UpdateTrainingDateAttendeeAttendance(c *fiber.Ctx, trainingID TrainingID, trainingDateID TrainingDateID, trainingDateAttendeeID TrainingDateAttendeeID) error + // Update status of a training date attendee payment + // (PUT /v1/trainings/{trainingID}/dates/{trainingDateID}/attendees/{trainingDateAttendeeID}/paid) + UpdateTrainingDateAttendeePayment(c *fiber.Ctx, trainingID TrainingID, trainingDateID TrainingDateID, trainingDateAttendeeID TrainingDateAttendeeID) error // List upcoming dates of a training // (GET /v1/trainings/{trainingID}/upcoming-dates) ListTrainingUpcomingDates(c *fiber.Ctx, trainingID TrainingID) error @@ -635,6 +657,70 @@ func (siw *ServerInterfaceWrapper) UpdateTrainingDateAttendee(c *fiber.Ctx) erro return siw.Handler.UpdateTrainingDateAttendee(c, trainingID, trainingDateID, trainingDateAttendeeID) } +// UpdateTrainingDateAttendeeAttendance operation middleware +func (siw *ServerInterfaceWrapper) UpdateTrainingDateAttendeeAttendance(c *fiber.Ctx) error { + + var err error + + // ------------- Path parameter "trainingID" ------------- + var trainingID TrainingID + + err = runtime.BindStyledParameterWithOptions("simple", "trainingID", c.Params("trainingID"), &trainingID, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, fmt.Errorf("Invalid format for parameter trainingID: %w", err).Error()) + } + + // ------------- Path parameter "trainingDateID" ------------- + var trainingDateID TrainingDateID + + err = runtime.BindStyledParameterWithOptions("simple", "trainingDateID", c.Params("trainingDateID"), &trainingDateID, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, fmt.Errorf("Invalid format for parameter trainingDateID: %w", err).Error()) + } + + // ------------- Path parameter "trainingDateAttendeeID" ------------- + var trainingDateAttendeeID TrainingDateAttendeeID + + err = runtime.BindStyledParameterWithOptions("simple", "trainingDateAttendeeID", c.Params("trainingDateAttendeeID"), &trainingDateAttendeeID, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, fmt.Errorf("Invalid format for parameter trainingDateAttendeeID: %w", err).Error()) + } + + return siw.Handler.UpdateTrainingDateAttendeeAttendance(c, trainingID, trainingDateID, trainingDateAttendeeID) +} + +// UpdateTrainingDateAttendeePayment operation middleware +func (siw *ServerInterfaceWrapper) UpdateTrainingDateAttendeePayment(c *fiber.Ctx) error { + + var err error + + // ------------- Path parameter "trainingID" ------------- + var trainingID TrainingID + + err = runtime.BindStyledParameterWithOptions("simple", "trainingID", c.Params("trainingID"), &trainingID, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, fmt.Errorf("Invalid format for parameter trainingID: %w", err).Error()) + } + + // ------------- Path parameter "trainingDateID" ------------- + var trainingDateID TrainingDateID + + err = runtime.BindStyledParameterWithOptions("simple", "trainingDateID", c.Params("trainingDateID"), &trainingDateID, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, fmt.Errorf("Invalid format for parameter trainingDateID: %w", err).Error()) + } + + // ------------- Path parameter "trainingDateAttendeeID" ------------- + var trainingDateAttendeeID TrainingDateAttendeeID + + err = runtime.BindStyledParameterWithOptions("simple", "trainingDateAttendeeID", c.Params("trainingDateAttendeeID"), &trainingDateAttendeeID, runtime.BindStyledParameterOptions{Explode: false, Required: true}) + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, fmt.Errorf("Invalid format for parameter trainingDateAttendeeID: %w", err).Error()) + } + + return siw.Handler.UpdateTrainingDateAttendeePayment(c, trainingID, trainingDateID, trainingDateAttendeeID) +} + // ListTrainingUpcomingDates operation middleware func (siw *ServerInterfaceWrapper) ListTrainingUpcomingDates(c *fiber.Ctx) error { @@ -706,6 +792,10 @@ func RegisterHandlersWithOptions(router fiber.Router, si ServerInterface, option router.Put(options.BaseURL+"/v1/trainings/:trainingID/dates/:trainingDateID/attendees/:trainingDateAttendeeID", wrapper.UpdateTrainingDateAttendee) + router.Put(options.BaseURL+"/v1/trainings/:trainingID/dates/:trainingDateID/attendees/:trainingDateAttendeeID/attended", wrapper.UpdateTrainingDateAttendeeAttendance) + + router.Put(options.BaseURL+"/v1/trainings/:trainingID/dates/:trainingDateID/attendees/:trainingDateAttendeeID/paid", wrapper.UpdateTrainingDateAttendeePayment) + router.Get(options.BaseURL+"/v1/trainings/:trainingID/upcoming-dates", wrapper.ListTrainingUpcomingDates) } @@ -1424,6 +1514,112 @@ func (response UpdateTrainingDateAttendee500ApplicationProblemPlusJSONResponse) return ctx.JSON(&response) } +type UpdateTrainingDateAttendeeAttendanceRequestObject struct { + TrainingID TrainingID `json:"trainingID"` + TrainingDateID TrainingDateID `json:"trainingDateID"` + TrainingDateAttendeeID TrainingDateAttendeeID `json:"trainingDateAttendeeID"` + Body *UpdateTrainingDateAttendeeAttendanceJSONRequestBody +} + +type UpdateTrainingDateAttendeeAttendanceResponseObject interface { + VisitUpdateTrainingDateAttendeeAttendanceResponse(ctx *fiber.Ctx) error +} + +type UpdateTrainingDateAttendeeAttendance200JSONResponse UpdateTrainingDateAttendeeResponse + +func (response UpdateTrainingDateAttendeeAttendance200JSONResponse) VisitUpdateTrainingDateAttendeeAttendanceResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/json") + ctx.Status(200) + + return ctx.JSON(&response) +} + +type UpdateTrainingDateAttendeeAttendance400ApplicationProblemPlusJSONResponse struct { + InvalidInputErrorApplicationProblemPlusJSONResponse +} + +func (response UpdateTrainingDateAttendeeAttendance400ApplicationProblemPlusJSONResponse) VisitUpdateTrainingDateAttendeeAttendanceResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/problem+json") + ctx.Status(400) + + return ctx.JSON(&response) +} + +type UpdateTrainingDateAttendeeAttendance404ApplicationProblemPlusJSONResponse struct { + NotFoundErrorApplicationProblemPlusJSONResponse +} + +func (response UpdateTrainingDateAttendeeAttendance404ApplicationProblemPlusJSONResponse) VisitUpdateTrainingDateAttendeeAttendanceResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/problem+json") + ctx.Status(404) + + return ctx.JSON(&response) +} + +type UpdateTrainingDateAttendeeAttendance500ApplicationProblemPlusJSONResponse struct { + InternalErrorApplicationProblemPlusJSONResponse +} + +func (response UpdateTrainingDateAttendeeAttendance500ApplicationProblemPlusJSONResponse) VisitUpdateTrainingDateAttendeeAttendanceResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/problem+json") + ctx.Status(500) + + return ctx.JSON(&response) +} + +type UpdateTrainingDateAttendeePaymentRequestObject struct { + TrainingID TrainingID `json:"trainingID"` + TrainingDateID TrainingDateID `json:"trainingDateID"` + TrainingDateAttendeeID TrainingDateAttendeeID `json:"trainingDateAttendeeID"` + Body *UpdateTrainingDateAttendeePaymentJSONRequestBody +} + +type UpdateTrainingDateAttendeePaymentResponseObject interface { + VisitUpdateTrainingDateAttendeePaymentResponse(ctx *fiber.Ctx) error +} + +type UpdateTrainingDateAttendeePayment200JSONResponse UpdateTrainingDateAttendeeResponse + +func (response UpdateTrainingDateAttendeePayment200JSONResponse) VisitUpdateTrainingDateAttendeePaymentResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/json") + ctx.Status(200) + + return ctx.JSON(&response) +} + +type UpdateTrainingDateAttendeePayment400ApplicationProblemPlusJSONResponse struct { + InvalidInputErrorApplicationProblemPlusJSONResponse +} + +func (response UpdateTrainingDateAttendeePayment400ApplicationProblemPlusJSONResponse) VisitUpdateTrainingDateAttendeePaymentResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/problem+json") + ctx.Status(400) + + return ctx.JSON(&response) +} + +type UpdateTrainingDateAttendeePayment404ApplicationProblemPlusJSONResponse struct { + NotFoundErrorApplicationProblemPlusJSONResponse +} + +func (response UpdateTrainingDateAttendeePayment404ApplicationProblemPlusJSONResponse) VisitUpdateTrainingDateAttendeePaymentResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/problem+json") + ctx.Status(404) + + return ctx.JSON(&response) +} + +type UpdateTrainingDateAttendeePayment500ApplicationProblemPlusJSONResponse struct { + InternalErrorApplicationProblemPlusJSONResponse +} + +func (response UpdateTrainingDateAttendeePayment500ApplicationProblemPlusJSONResponse) VisitUpdateTrainingDateAttendeePaymentResponse(ctx *fiber.Ctx) error { + ctx.Response().Header.Set("Content-Type", "application/problem+json") + ctx.Status(500) + + return ctx.JSON(&response) +} + type ListTrainingUpcomingDatesRequestObject struct { TrainingID TrainingID `json:"trainingID"` } @@ -1516,6 +1712,12 @@ type StrictServerInterface interface { // Update a training date attendee by ID // (PUT /v1/trainings/{trainingID}/dates/{trainingDateID}/attendees/{trainingDateAttendeeID}) UpdateTrainingDateAttendee(ctx context.Context, request UpdateTrainingDateAttendeeRequestObject) (UpdateTrainingDateAttendeeResponseObject, error) + // Update status of a training date attendee attendance + // (PUT /v1/trainings/{trainingID}/dates/{trainingDateID}/attendees/{trainingDateAttendeeID}/attended) + UpdateTrainingDateAttendeeAttendance(ctx context.Context, request UpdateTrainingDateAttendeeAttendanceRequestObject) (UpdateTrainingDateAttendeeAttendanceResponseObject, error) + // Update status of a training date attendee payment + // (PUT /v1/trainings/{trainingID}/dates/{trainingDateID}/attendees/{trainingDateAttendeeID}/paid) + UpdateTrainingDateAttendeePayment(ctx context.Context, request UpdateTrainingDateAttendeePaymentRequestObject) (UpdateTrainingDateAttendeePaymentResponseObject, error) // List upcoming dates of a training // (GET /v1/trainings/{trainingID}/upcoming-dates) ListTrainingUpcomingDates(ctx context.Context, request ListTrainingUpcomingDatesRequestObject) (ListTrainingUpcomingDatesResponseObject, error) @@ -2035,6 +2237,76 @@ func (sh *strictHandler) UpdateTrainingDateAttendee(ctx *fiber.Ctx, trainingID T return nil } +// UpdateTrainingDateAttendeeAttendance operation middleware +func (sh *strictHandler) UpdateTrainingDateAttendeeAttendance(ctx *fiber.Ctx, trainingID TrainingID, trainingDateID TrainingDateID, trainingDateAttendeeID TrainingDateAttendeeID) error { + var request UpdateTrainingDateAttendeeAttendanceRequestObject + + request.TrainingID = trainingID + request.TrainingDateID = trainingDateID + request.TrainingDateAttendeeID = trainingDateAttendeeID + + var body UpdateTrainingDateAttendeeAttendanceJSONRequestBody + if err := ctx.BodyParser(&body); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + request.Body = &body + + handler := func(ctx *fiber.Ctx, request interface{}) (interface{}, error) { + return sh.ssi.UpdateTrainingDateAttendeeAttendance(ctx.UserContext(), request.(UpdateTrainingDateAttendeeAttendanceRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "UpdateTrainingDateAttendeeAttendance") + } + + response, err := handler(ctx, request) + + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } else if validResponse, ok := response.(UpdateTrainingDateAttendeeAttendanceResponseObject); ok { + if err := validResponse.VisitUpdateTrainingDateAttendeeAttendanceResponse(ctx); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} + +// UpdateTrainingDateAttendeePayment operation middleware +func (sh *strictHandler) UpdateTrainingDateAttendeePayment(ctx *fiber.Ctx, trainingID TrainingID, trainingDateID TrainingDateID, trainingDateAttendeeID TrainingDateAttendeeID) error { + var request UpdateTrainingDateAttendeePaymentRequestObject + + request.TrainingID = trainingID + request.TrainingDateID = trainingDateID + request.TrainingDateAttendeeID = trainingDateAttendeeID + + var body UpdateTrainingDateAttendeePaymentJSONRequestBody + if err := ctx.BodyParser(&body); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + request.Body = &body + + handler := func(ctx *fiber.Ctx, request interface{}) (interface{}, error) { + return sh.ssi.UpdateTrainingDateAttendeePayment(ctx.UserContext(), request.(UpdateTrainingDateAttendeePaymentRequestObject)) + } + for _, middleware := range sh.middlewares { + handler = middleware(handler, "UpdateTrainingDateAttendeePayment") + } + + response, err := handler(ctx, request) + + if err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } else if validResponse, ok := response.(UpdateTrainingDateAttendeePaymentResponseObject); ok { + if err := validResponse.VisitUpdateTrainingDateAttendeePaymentResponse(ctx); err != nil { + return fiber.NewError(fiber.StatusBadRequest, err.Error()) + } + } else if response != nil { + return fmt.Errorf("unexpected response type: %T", response) + } + return nil +} + // ListTrainingUpcomingDates operation middleware func (sh *strictHandler) ListTrainingUpcomingDates(ctx *fiber.Ctx, trainingID TrainingID) error { var request ListTrainingUpcomingDatesRequestObject @@ -2065,43 +2337,45 @@ func (sh *strictHandler) ListTrainingUpcomingDates(ctx *fiber.Ctx, trainingID Tr // Base64 encoded, gzipped, json marshaled Swagger object var swaggerSpec = []string{ - "H4sIAAAAAAAC/+xc3XLbuBV+FQzau9Ki0s3O7uiqrp3uerqNXcfuRVNfwOSRiIQEGAC0o/HoSXrVd2nf", - "qwOA/wJFypIi2dGdQ4EHH87vB+AwTzjgScoZMCXx5AmnRJAEFAjzrxtBKKNsdk4UnCoFLAS4ONe/hCAD", - "QVNFOcOTchzSA1ExEl2cYw9TPSAlKsIeZiQBPMHKLdbDAr5kVECIJ0pk4GEZRJAQPd/vBUzxBP/Or+D6", - "9lfpd6BcLLzGAvqBD8G7JZwtfCux9cHaAiQDZ6GlyJQzCcb6F0yBYCR+JwQX+kHAmQKm9J8kTWMaEA3V", - "TwW/jyH5wyepcT8NnPrKvnUOitBY2umbCijmR2AALDx8wR5ITMMLlmZqf6gMBkQ1iArae67+wjMW7gvW", - "e67QVAMoIC0KHzC2PBNAFLgi5Rq+ZCANzlTwFISi1vwaBmFz/aeap9rhpBKUzfRqISE01r9MuUiIwpP8", - "ibc8lMoPKgtzTYQwJVms8GRKYgnl6HvOYyBMD7e+7ZgyjTjr+IVLarWw9OOiHhgfrXCvxGpFeuVKa6Lu", - "Smz8/hMESs+zSoc2bIyx4/hyiicfVxv0PTy6BOGF1zbDPY3jfveggX4XR0TmosJh6o6IvCJ04GA77pmp", - "uG4HGmLPLqxC0AS/rP87pwU6vZeEoQApnQ4TkJQEVM0bDkyZ+hl7OKGMJlmCJ29KBJQpmIGJ8pAoaLxl", - "HrS93sNfT2b8JH+oaAKjG5qAFTCXzmnJVzvtj30QqLxkMW2EQs1EMbd5xh0oxk2G+pJURCiDu45Xr2Y5", - "zFv2bVSmXEWVuFwLtaXUcHul5Wp2KqAPi8qNo9ERheu5vtvlh/h0pz9v7jiNeuHwju7MK2ig/9RqUJDI", - "oZooPSmXSIQg866cnLtEHWQ1c7/dN7L5RvZex9a/gHJlyDOeMVVfQbsQZ7Z6duaq8bK9W5CsDJceOzAd", - "S9q3KWkt9b+s3FUD/zIC8Dcq1Wkc36YBTyib1dct6yso81w7Casc3Tp5MDdLKw169Sr5/KUulVrpjPL2", - "3FoRLs92a2Hd+Bgy42Yz9c1QWHj3Mz1fuktyPSiOHKCPA7Rz33EX8L3uArrIx/FUo+9U46pwh1bkJAXr", - "XA6cTAhggdEhMO2iH/HZP/+KPfzu9hp7+PbDeW0mZzQknMF8dFYIqv14kpLgM5lZRERFeIJnVMXkfpQQ", - "ATL6Mgp44kdf/PlsFgoiaezT/JzQN1KLg8wa962myVfl1kPjiG3pOPaDiQykIqJQQISgIJGKAIX2BcSn", - "iDB7+IYo03//enNzhYoT1RH6AIAipVI58f2QKKIECT6DGFFQ0xEXMz/kgR+pJPbFNPjp5/FPaMoFSrgA", - "RJn1SMrZ6F82KTbqgoGwDPkURVlC2IkAEpL7GBB8TWPCjBwkUwjolAZIcaQiKhEPckWBXoteWn5WOXIG", - "AJOKMOs57Vlvry+QgClYYUZjVMcKnRZKKydfb1KpiMoctrmJwGrbDkABDwHNgIEgCkJ0PzeSuaAzypAE", - "8QDCKHfwumuZV1EVwwBdyyxJiJi3ZCIt0Lk2++A5yuwR3c7K+tdiGaVKvcKJapZ1RUmdnBwuzW+TgsPf", - "SXUVr+PWe3db7+7bzbL+Z5mRtZLY5VJGN123mlVto0nKhVqjtKWfZ74qo8d5obkx1p1h3AK+nWErWc+w", - "ACtCoh1ORdIuaNDl1bv32MNnl9dXl9enN++WeZAzHbv98zYNj3d2G7LbVTo8HnB+iyy7bIHjnd33vlt3", - "+cRLOvdu4j/e2Q09r2vr7fCvDBZmqzvlRUcPCYyd81qKKUn+9MA/KQgiw0E0A6katP7BP6n//juI0N+I", - "gP/9B3s4E/qt4hTg8fFxtPS2Tgg0gFwvuaQrwVNBQRExr+1BsZYrf/07Or26wB5+ACHtrnE8ejMa64E8", - "BUZSiif4h9F4NNbmISoy2vIf3pTUyDyYgVma1qgJ64sQT5on3bjVIPbH8XhFp9N6HU7uI3VHo9MpiqlU", - "Zltd4lp4+EeLxTVFidlvdrSZFim7S89Xikgc18R6WBGtm4+4UsGdJS8OVTUvpPOWPJDqzzycb01N7m6B", - "1pGXEhkslmz1Zmcguo1V9jAG5pVQW+rtMEu1O/22YWMLHBHE4LG0c4eZF14zRPwsv1I6KW8BOyOm64px", - "1wHUe7XpMNFveTTVXR8Va0V2rcZqb/t132yC3GpUNhG1AcuhRnyqaM7CEugYLD1sWvHcPK8Fc70xuqNK", - "VUMaheZuyehvVzT7WkDhHlVul45I5Q33c9uD7M6GziiodQZsWXnbixhX94Kz4Kjahe2ejPILqOEWSTOH", - "RZrca3OjbL+2uVn1oNo23hmIAbUtM69sWNv25Fd2uUNda2U69fvrYrsYHmZe6O5UWVE+S/0dTMWsCmUf", - "1RnGaM/tmcDBpY3upvC90uLGqcaq9GEC8ID5MSrOy56XEKpH9pRlDdq1scd5g0cXJ0BrkjWtrUNkbAbY", - "ZrTtIJS/E7LXF5kHl9Jb5G+AcQcwwH3Zd9e8ce0CMN4pkKEF4HWRyF4XfU7h8EnRpDyYZJZtza8ok/W3", - "bg/NaahS6AHw1RJMk7Ouoh/DiWt5WfsqMl7/17x7p75L1+y9GbCw/3a48J68uZtBl+vbSUb0y4/EhvC6", - "xodnr5fkub+vcziiGXCY6dHF/apIye23A396cv8nHWvu3vaUdtd7o9708oz9X2mNg90Ilgg33xG+AoPu", - "PN2sX/IONb9sZZP5Ml3mW2xTn0Xaxt8E0Nqk7RXuXweFweoyu0bPgPPL1RdxR+L+1vbF3JU4Ogt6e0O0", - "FPMZkTVKa5k8IDEK4QFinibAVP7JUaP/a+L7sR4XcakmP4zHY2OvfLK2xMvCWyQi9zxTjb6HvEWswre4", - "W/w/AAD//zpRcbTXTQAA", + "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", + "AAA=", } // GetSwagger returns the content of the embedded swagger specification file diff --git a/internal/server/api.go b/internal/server/api.go index ac1eda1..1d97a58 100644 --- a/internal/server/api.go +++ b/internal/server/api.go @@ -797,3 +797,171 @@ func (h *APIHandlers) UpdateTrainingDateAttendee(ctx context.Context, req Update }, }, nil } + +func (h *APIHandlers) UpdateTrainingDateAttendeePayment(ctx context.Context, req UpdateTrainingDateAttendeePaymentRequestObject) (UpdateTrainingDateAttendeePaymentResponseObject, error) { + _, err := h.trainingRepository.FindByID(req.TrainingID) + if err != nil { + if errors.Is(err, training.ErrTrainingNotFound) { + return UpdateTrainingDateAttendeePayment404ApplicationProblemPlusJSONResponse{ + NotFoundErrorApplicationProblemPlusJSONResponse: NotFoundErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusNotFound, + Title: "Not Found: Training not found", + }}, nil + } else { + return UpdateTrainingDateAttendeePayment500ApplicationProblemPlusJSONResponse{ + InternalErrorApplicationProblemPlusJSONResponse: InternalErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusInternalServerError, + Title: "Internal Server Error: Failed to get training", + Detail: err.Error(), + }}, nil + } + } + + _, err = h.trainingDateRepository.FindByID(req.TrainingDateID) + if err != nil { + if errors.Is(err, training.ErrTrainingDateNotFound) { + return UpdateTrainingDateAttendeePayment404ApplicationProblemPlusJSONResponse{ + NotFoundErrorApplicationProblemPlusJSONResponse: NotFoundErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusNotFound, + Title: "Not Found: Training date not found", + }}, nil + } else { + return UpdateTrainingDateAttendeePayment500ApplicationProblemPlusJSONResponse{ + InternalErrorApplicationProblemPlusJSONResponse: InternalErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusInternalServerError, + Title: "Internal Server Error: Failed to get training date", + Detail: err.Error(), + }}, nil + } + } + + ta, err := h.trainingDateAttendeeRepository.FindByID(req.TrainingDateAttendeeID) + if err != nil { + if errors.Is(err, training.ErrTrainingDateAttendeeNotFound) { + return UpdateTrainingDateAttendeePayment404ApplicationProblemPlusJSONResponse{ + NotFoundErrorApplicationProblemPlusJSONResponse: NotFoundErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusNotFound, + Title: "Not Found: Training date attendee not found", + }}, nil + } else { + return UpdateTrainingDateAttendeePayment500ApplicationProblemPlusJSONResponse{ + InternalErrorApplicationProblemPlusJSONResponse: InternalErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusInternalServerError, + Title: "Internal Server Error: Failed to get training date attendee", + Detail: err.Error(), + }}, nil + } + } + + ta.HasPaid = req.Body.Paid + + err = h.trainingDateAttendeeRepository.Update(ta) + if err != nil { + return UpdateTrainingDateAttendeePayment500ApplicationProblemPlusJSONResponse{ + InternalErrorApplicationProblemPlusJSONResponse: InternalErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusInternalServerError, + Title: "Internal Server Error: Failed to update training date attendee", + Detail: err.Error(), + }}, nil + } + + return UpdateTrainingDateAttendeePayment200JSONResponse{ + Id: ta.ID, + Name: ta.Name, + Email: types.Email(ta.Email), + Phone: ta.Phone, + Company: ta.Company, + Position: ta.Position, + IsStudent: &ta.IsStudent, + HasAttended: ta.HasAttended, + HasPaid: ta.HasPaid, + Bill: Price{ + Amount: ta.Bill.Amount.String(), + Currency: ta.Bill.Currency, + }, + }, nil +} + +func (h *APIHandlers) UpdateTrainingDateAttendeeAttendance(ctx context.Context, req UpdateTrainingDateAttendeeAttendanceRequestObject) (UpdateTrainingDateAttendeeAttendanceResponseObject, error) { + _, err := h.trainingRepository.FindByID(req.TrainingID) + if err != nil { + if errors.Is(err, training.ErrTrainingNotFound) { + return UpdateTrainingDateAttendeeAttendance404ApplicationProblemPlusJSONResponse{ + NotFoundErrorApplicationProblemPlusJSONResponse: NotFoundErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusNotFound, + Title: "Not Found: Training not found", + }}, nil + } else { + return UpdateTrainingDateAttendeeAttendance500ApplicationProblemPlusJSONResponse{ + InternalErrorApplicationProblemPlusJSONResponse: InternalErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusInternalServerError, + Title: "Internal Server Error: Failed to get training", + Detail: err.Error(), + }}, nil + } + } + + _, err = h.trainingDateRepository.FindByID(req.TrainingDateID) + if err != nil { + if errors.Is(err, training.ErrTrainingDateNotFound) { + return UpdateTrainingDateAttendeeAttendance404ApplicationProblemPlusJSONResponse{ + NotFoundErrorApplicationProblemPlusJSONResponse: NotFoundErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusNotFound, + Title: "Not Found: Training date not found", + }}, nil + } else { + return UpdateTrainingDateAttendeeAttendance500ApplicationProblemPlusJSONResponse{ + InternalErrorApplicationProblemPlusJSONResponse: InternalErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusInternalServerError, + Title: "Internal Server Error: Failed to get training date", + Detail: err.Error(), + }}, nil + } + } + + ta, err := h.trainingDateAttendeeRepository.FindByID(req.TrainingDateAttendeeID) + if err != nil { + if errors.Is(err, training.ErrTrainingDateAttendeeNotFound) { + return UpdateTrainingDateAttendeeAttendance404ApplicationProblemPlusJSONResponse{ + NotFoundErrorApplicationProblemPlusJSONResponse: NotFoundErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusNotFound, + Title: "Not Found: Training date attendee not found", + }}, nil + } else { + return UpdateTrainingDateAttendeeAttendance500ApplicationProblemPlusJSONResponse{ + InternalErrorApplicationProblemPlusJSONResponse: InternalErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusInternalServerError, + Title: "Internal Server Error: Failed to get training date attendee", + Detail: err.Error(), + }}, nil + } + } + + ta.HasAttended = req.Body.Attended + + err = h.trainingDateAttendeeRepository.Update(ta) + if err != nil { + return UpdateTrainingDateAttendeeAttendance500ApplicationProblemPlusJSONResponse{ + InternalErrorApplicationProblemPlusJSONResponse: InternalErrorApplicationProblemPlusJSONResponse{ + Status: fiber.StatusInternalServerError, + Title: "Internal Server Error: Failed to update training date attendee", + Detail: err.Error(), + }}, nil + } + + return UpdateTrainingDateAttendeeAttendance200JSONResponse{ + Id: ta.ID, + Name: ta.Name, + Email: types.Email(ta.Email), + Phone: ta.Phone, + Company: ta.Company, + Position: ta.Position, + IsStudent: &ta.IsStudent, + HasAttended: ta.HasAttended, + HasPaid: ta.HasPaid, + Bill: Price{ + Amount: ta.Bill.Amount.String(), + Currency: ta.Bill.Currency, + }, + }, nil +}