eintopf.info@v0.13.16/service/event/transport.go (about)

     1  // Copyright (C) 2022 The Eintopf authors
     2  //
     3  // This program is free software: you can redistribute it and/or modify
     4  // it under the terms of the GNU Affero General Public License as
     5  // published by the Free Software Foundation, either version 3 of the
     6  // License, or (at your option) any later version.
     7  //
     8  // This program is distributed in the hope that it will be useful,
     9  // but WITHOUT ANY WARRANTY; without even the implied warranty of
    10  // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    11  // GNU Affero General Public License for more details.
    12  //
    13  // You should have received a copy of the GNU Affero General Public License
    14  // along with this program.  If not, see <https://www.gnu.org/licenses/>.
    15  
    16  package event
    17  
    18  import (
    19  	"github.com/go-chi/chi/v5"
    20  
    21  	"eintopf.info/internal/crud"
    22  	"eintopf.info/internal/xhttp"
    23  	"eintopf.info/service/auth"
    24  )
    25  
    26  // Router returns a new http router that handles crud event requests for a given
    27  // event service.
    28  func Router(storer Storer, authService auth.Service) func(chi.Router) {
    29  	handler := crud.NewHandler(storer)
    30  	return func(r chi.Router) {
    31  		r.Options("/", xhttp.CorsHandler)
    32  
    33  		// swagger:route GET /events/ event findEvents
    34  		//
    35  		// Retrieves all events.
    36  		//
    37  		// Parameters:
    38  		//   + name: offset
    39  		//     description: offset in event list
    40  		//     in: query
    41  		//     type: integer
    42  		//     required: false
    43  		//   + name: limit
    44  		//     description: limits the event list
    45  		//     in: query
    46  		//     type: integer
    47  		//     required: false
    48  		//   + name: sort
    49  		//     description: field that gets sorted
    50  		//     in: query
    51  		//     type: string
    52  		//     required: false
    53  		//   + name: order
    54  		//     description: sort order ("ASC" or "DESC")
    55  		//     in: query
    56  		//     type: string
    57  		//     required: false
    58  		//   + name: filters
    59  		//     description: filters get combined with AND logic
    60  		//     in: query
    61  		//     type: object
    62  		//     required: false
    63  		//
    64  		//     Responses:
    65  		//       200: findEventsResponse
    66  		//       400: badRequest
    67  		//       401: unauthorizedError
    68  		//       500: internalError
    69  		//       500: internalError
    70  		//       503: serviceUnavailable
    71  		r.With(auth.MiddlewareWithOpts(authService, auth.MiddlewareOpts{Validate: false})).
    72  			Get("/", handler.Find)
    73  
    74  		// swagger:route POST /events/ event createEvent
    75  		//
    76  		// Creates a new event with the given data.
    77  		//     Security:
    78  		//       bearer: []
    79  		//
    80  		//     Responses:
    81  		//       200: createEventResponse
    82  		//       400: badRequest
    83  		//       401: unauthorizedError
    84  		//       500: internalError
    85  		//       503: serviceUnavailable
    86  		r.With(auth.Middleware(authService)).
    87  			Post("/", handler.Create)
    88  
    89  		r.Options("/{id}", xhttp.CorsHandler)
    90  
    91  		// swagger:route GET /events/{id} event findEvent
    92  		//
    93  		// Finds the event with the given id.
    94  		//
    95  		//     Responses:
    96  		//       200: findEventResponse
    97  		//       400: badRequest
    98  		//       401: unauthorizedError
    99  		//       500: internalError
   100  		//       503: serviceUnavailable
   101  		r.Get("/{id}", handler.FindByID)
   102  
   103  		// swagger:route PUT /events/{id} event updateEvent
   104  		//
   105  		// Updates the event with the given id.
   106  		//     Security:
   107  		//       bearer: []
   108  		//
   109  		//     Responses:
   110  		//       200: updateEventResponse
   111  		//       400: badRequest
   112  		//       401: unauthorizedError
   113  		//       500: internalError
   114  		//       503: serviceUnavailable
   115  		r.With(auth.Middleware(authService)).
   116  			Put("/{id}", handler.Update)
   117  
   118  		// swagger:route DELETE /events/{id} event deleteEvent
   119  		//
   120  		// Deletes the event with the given id.
   121  		//     Security:
   122  		//       bearer: []
   123  		//
   124  		//     Responses:
   125  		//       200: deleteEventResponse
   126  		//       400: badRequest
   127  		//       401: unauthorizedError
   128  		//       500: internalError
   129  		//       503: serviceUnavailable
   130  		r.With(auth.Middleware(authService)).
   131  			Delete("/{id}", handler.Delete)
   132  	}
   133  }
   134  
   135  // swagger:response findEventsResponse
   136  type findResponse struct {
   137  	// in:body
   138  	Events []*Event
   139  
   140  	// in:header
   141  	TotalEvents int `json:"x-total-count"`
   142  }
   143  
   144  // swagger:parameters createEvent
   145  type createRequest struct {
   146  	// in:body
   147  	Event *NewEvent
   148  }
   149  
   150  // swagger:response createEventResponse
   151  type createResponse struct {
   152  	// in:body
   153  	Event *Event
   154  }
   155  
   156  // swagger:parameters findEvent
   157  type findByIDRequest struct {
   158  	// in:query
   159  	ID string `json:"id"`
   160  }
   161  
   162  // swagger:response findEventResponse
   163  type findByIDResponse struct {
   164  	// in:body
   165  	Event *Event
   166  }
   167  
   168  type FindResponse[Model any] struct {
   169  	// in:body
   170  	Model *Model
   171  }
   172  
   173  // swagger:parameters updateEvent
   174  type updateRequest struct {
   175  	// in:body
   176  	Event *Event
   177  }
   178  
   179  // swagger:response updateEventResponse
   180  type updateResponse struct {
   181  	// in:body
   182  	Event *Event
   183  }
   184  
   185  // swagger:parameters deleteEvent
   186  type deleteRequest struct {
   187  	// in:query
   188  	ID string `json:"id"`
   189  }
   190  
   191  // swagger:response deleteEventResponse
   192  type deleteResponse struct{}