eintopf.info@v0.13.16/service/user/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 user
    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 user requests for a given
    27  // user service.
    28  func Router(storer Storer, authService auth.Service) func(chi.Router) {
    29  	handler := crud.NewHandler[NewUser, User, FindFilters](storer)
    30  	return func(r chi.Router) {
    31  		r.Options("/", xhttp.CorsHandler)
    32  
    33  		// swagger:route GET /users/ users findUsers
    34  		//
    35  		// Retrieves all users.
    36  		//     Security:
    37  		//       bearer: []
    38  		//
    39  		//     Responses:
    40  		//       200: findUsersResponse
    41  		//       400: badRequest
    42  		//       401: unauthorizedError
    43  		//       500: internalError
    44  		//       503: serviceUnavailable
    45  		r.With(auth.Middleware(authService)).
    46  			Get("/", handler.Find)
    47  
    48  		// swagger:route POST /users/ user createUser
    49  		//
    50  		// Creates a new new user.
    51  		//     Security:
    52  		//       bearer: []
    53  		//
    54  		//     Responses:
    55  		//       200: createUserResponse
    56  		//       400: badRequest
    57  		//       401: unauthorizedError
    58  		//       500: internalError
    59  		//       503: serviceUnavailable
    60  		r.With(auth.Middleware(authService)).
    61  			Post("/", handler.Create)
    62  
    63  		r.Options("/{id}", xhttp.CorsHandler)
    64  
    65  		// swagger:route GET /users/{id} user findUser
    66  		//
    67  		// Finds the user with the given id.
    68  		//     Security:
    69  		//       bearer: []
    70  		//
    71  		//     Responses:
    72  		//       200: findUserResponse
    73  		//       400: badRequest
    74  		//       401: unauthorizedError
    75  		//       500: internalError
    76  		//       503: serviceUnavailable
    77  		r.With(auth.Middleware(authService)).
    78  			Get("/{id}", handler.FindByID)
    79  
    80  		// swagger:route PUT /users/{id} user updateUser
    81  		//
    82  		// Updates the user with the given id.
    83  		//     Security:
    84  		//       bearer: []
    85  		//
    86  		//     Responses:
    87  		//       200: updateUserResponse
    88  		//       400: badRequest
    89  		//       401: unauthorizedError
    90  		//       500: internalError
    91  		//       503: serviceUnavailable
    92  
    93  		r.With(auth.Middleware(authService)).
    94  			Put("/{id}", handler.Update)
    95  
    96  		// swagger:route DELETE /users/{id} user deleteUser
    97  		//
    98  		// Deletes the user with the given id.
    99  		//     Security:
   100  		//       bearer: []
   101  		//
   102  		//     Responses:
   103  		//       200: deleteUserResponse
   104  		//       400: badRequest
   105  		//       401: unauthorizedError
   106  		//       500: internalError
   107  		//       503: serviceUnavailable
   108  		r.With(auth.Middleware(authService)).
   109  			Delete("/{id}", handler.Delete)
   110  	}
   111  }
   112  
   113  type router struct {
   114  	s Service
   115  }
   116  
   117  // swagger:parameters findUsers
   118  type findRequest struct {
   119  	// in:query
   120  	Start int64 `json:"_start"`
   121  	// in:query
   122  	End int64 `json:"_end"`
   123  	// in:query
   124  	Sort string `json:"_sort"`
   125  	// in:query
   126  	Order SortOrder `json:"_order"`
   127  
   128  	// in:query
   129  	FilterID *string `json:"id"`
   130  	// in:query
   131  	FilterDeactivated *bool `json:"deactivated"`
   132  	// in:query
   133  	FilterEmail *string `json:"email"`
   134  	// in:query
   135  	FilterNickname *string `json:"nickname"`
   136  	// in:query
   137  	FilterRole *auth.Role `json:"role"`
   138  }
   139  
   140  // swagger:response findUsersResponse
   141  type findResponse struct {
   142  
   143  	// in:body
   144  	Users []User
   145  
   146  	// in:header
   147  	TotalUsers int `json:"x-total-count"`
   148  }
   149  
   150  // swagger:parameters createUser
   151  type createRequest struct {
   152  
   153  	// in:body
   154  	NewUser *NewUser
   155  }
   156  
   157  // swagger:response createUserResponse
   158  type createResponse struct {
   159  
   160  	// in:body
   161  	User *User
   162  }
   163  
   164  // swagger:parameters updateUser
   165  type updateRequest struct {
   166  
   167  	// in:body
   168  	User *User
   169  }
   170  
   171  //swagger:response updateUserResponse
   172  type updateResponse struct {
   173  
   174  	// in:body
   175  	User *User
   176  }
   177  
   178  // swagger:parameters deleteUser
   179  type deleteRequest struct {
   180  
   181  	// in:query
   182  	ID string `json:"id"`
   183  }
   184  
   185  // swagger:response deleteUserResponse
   186  type deleteResponse struct{}
   187  
   188  // swagger:parameters findUser
   189  type findByIDRequest struct {
   190  
   191  	// in:query
   192  	ID string `json:"id"`
   193  }
   194  
   195  // swagger:response findUserResponse
   196  type findByIDResponse struct {
   197  
   198  	// in:body
   199  	User *User
   200  }