cml04-mediciones-service/internal/server/server.go

484 lines
15 KiB
Go
Raw Normal View History

2024-08-20 09:09:31 +02:00
package server
import (
"encoding/json"
"net/http"
"path"
"time"
"git.espin.casa/albert/cml04-mediciones-service/internal/service"
"git.espin.casa/albert/cml04-mediciones-service/internal/types"
"github.com/zc2638/swag"
"github.com/zc2638/swag/endpoint"
"github.com/zc2638/swag/option"
)
type Server struct {
api *swag.API
Url string
}
func GetToleranceEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/tolerance",
endpoint.BodyR(types.GetToleranciaReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.GetToleranciaRes{})),
endpoint.Summary("Info about product tolerances"),
endpoint.Description("Info about product tolerances"),
endpoint.Handler(GetToleranceHandler(svc)),
)
}
func PostToleranceEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/tolerance/create",
endpoint.BodyR(types.CreateToleranceReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.CreateToleranceRes{})),
endpoint.Summary("create a new product tolerances"),
endpoint.Description("create a new product tolerances"),
endpoint.Handler(PostToleranceHandler(svc)),
)
}
func GetProductionOrderEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/po",
endpoint.BodyR(types.GetProductionOrderReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.GetProductionOrderRes{})),
endpoint.Summary("get production order data"),
endpoint.Description("get production order data"),
endpoint.Handler(GetProductionOrderHandler(svc)),
)
}
func GetProductionOrdersEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/pos",
endpoint.BodyR(types.GetProductionOrdersReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.GetProductionOrdersRes{})),
endpoint.Summary("get production order data"),
endpoint.Description("get production order data"),
endpoint.Handler(GetProductionOrdersHandler(svc)),
)
}
func GetMedicionEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/medicion",
endpoint.BodyR(types.GetMedicionReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.GetMedicionRes{})),
endpoint.Summary("get medicion data"),
endpoint.Description("get medicion data"),
endpoint.Handler(GetMedicionHandler(svc)),
)
}
func GetMedicionesEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/mediciones",
endpoint.BodyR(types.GetMedicionesReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.GetMedicionesRes{})),
endpoint.Summary("get mediciones data"),
endpoint.Description("get mediciones data"),
endpoint.Handler(GetMedicionesHandler(svc)),
)
}
func PostMedicionesEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/medicion/create",
endpoint.BodyR(types.PostMedicionesReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.PostMedicionesRes{})),
endpoint.Summary("get mediciones data"),
endpoint.Description("get mediciones data"),
endpoint.Handler(PostMedicionesHandler(svc)),
)
}
func GetUserEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/user",
endpoint.BodyR(types.GetUsuarioReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.GetUsuarioRes{})),
endpoint.Summary("Get user based on email primary key"),
endpoint.Description("Get user based on email primary key"),
endpoint.Handler(GetUserHandler(svc)),
)
}
func CreateUserEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/user/create",
endpoint.BodyR(types.CreateUsuarioReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.CreateUsuarioRes{})),
endpoint.Summary("Create a new user"),
endpoint.Description("Create a new user"),
endpoint.Handler(CreateUserHandler(svc)),
)
}
func ValidateUserEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/user/validate",
endpoint.BodyR(types.ValidarUsuarioReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.ValidarUsuarioRes{})),
endpoint.Summary("User validation"),
endpoint.Description("User validation"),
endpoint.Handler(ValidateUserHandler(svc)),
)
}
func GetExcelEndPoint(svc service.IService) *swag.Endpoint {
return endpoint.New(http.MethodPost, "/excel/get",
endpoint.BodyR(types.GetExcelReq{}),
endpoint.Response(http.StatusOK, "ok", endpoint.SchemaResponseOption(types.GetExcelRes{})),
endpoint.Summary("get excel mediciones"),
endpoint.Description("get excel mediciones"),
endpoint.Handler(GetExcelHandler(svc)),
)
}
func GetExcelHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.GetExcelReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
res, err := svc.GetExcel(r.Context(), req)
if err != nil {
http.Error(w, "get excel handler failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func ValidateUserHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.ValidarUsuarioReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
//
res, err := svc.ValidarUsuario(r.Context(), req)
if err != nil {
http.Error(w, "validate user failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func GetUserHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.GetUsuarioReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
// get user from database
res, err := svc.GetUsuario(r.Context(), req)
if err != nil {
http.Error(w, "get user failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func CreateUserHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.CreateUsuarioReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
// create user service call
res, err := svc.CreateUsuario(r.Context(), req)
if err != nil {
http.Error(w, "create user failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func PostMedicionesHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.PostMedicionesReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
// post medicion
res, err := svc.PostMediciones(r.Context(), req)
if err != nil {
http.Error(w, "post medicion failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func GetMedicionesHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.GetMedicionesReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
// get mediciones
res, err := svc.GetMediciones(r.Context(), req)
if err != nil {
http.Error(w, "get mediciones failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func GetMedicionHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.GetMedicionReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
// get medicion
res, err := svc.GetMedicion(r.Context(), req)
if err != nil {
http.Error(w, "get medicion failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func GetProductionOrdersHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.GetProductionOrdersReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
// get production orders
res, err := svc.GetProductionOrders(r.Context(), req)
if err != nil {
http.Error(w, "get production orders failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func GetToleranceHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.GetToleranciaReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
// get tolerancia from database
res, err := svc.GetTolerance(r.Context(), req)
if err != nil {
http.Error(w, "get tolerancia failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func PostToleranceHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.CreateToleranceReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
// post tolerance into database
res, err := svc.CreateTolerance(r.Context(), req)
if err != nil {
http.Error(w, "create tolerance for product failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
// write response
if err := json.NewEncoder(w).Encode(&res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func GetProductionOrderHandler(svc service.IService) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// request body holder
req := types.GetProductionOrderReq{}
// decode json body request
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
http.Error(w, "body json decoding failed", http.StatusBadRequest)
return
}
//
res, err := svc.GetProductionOrder(r.Context(), req)
if err != nil {
http.Error(w, "get production order failed", http.StatusInternalServerError)
return
}
// set content type header
w.Header().Set("Content-Type", "application/json")
// response
w.WriteHeader(http.StatusOK)
//
if err := json.NewEncoder(w).Encode(res); err != nil {
http.Error(w, "encode response failed", http.StatusInternalServerError)
return
}
})
}
func (s *Server) Start() error {
// set api handlers
for p, endpoints := range s.api.Paths {
http.DefaultServeMux.Handle(path.Join(s.api.BasePath, p), endpoints)
}
// set swagger handlers
http.DefaultServeMux.Handle("/swagger/json", s.api.Handler())
patterns := swag.UIPatterns("/swagger/ui")
for _, pattern := range patterns {
http.DefaultServeMux.Handle(pattern, swag.UIHandler("/swagger/ui", "/swagger/json", true))
}
// Crear un servidor HTTP
server := http.Server{
Addr: s.Url,
ReadTimeout: 5 * time.Second, // time limit for reading
WriteTimeout: 5 * time.Second, // time limit for writting
IdleTimeout: 5 * time.Second,
}
// start api
go func() {
if err := server.ListenAndServe(); err != nil {
panic(err)
}
}()
return nil
}
func NewServer(url string, svc service.IService) *Server {
// create new swag
api := swag.New(
option.Title("CELSA 4 Mediciones REST API Server 22"),
option.Description("This is an implementation of a REST API server for mediciones"),
option.ContactEmail("aespin@gcelsa.com"),
option.Version("1.0"),
option.BasePath("/api/v1"),
option.License("MIT", "https://opensource.org/license/mit"),
)
// add end points
api.AddEndpoint(
GetToleranceEndPoint(svc),
PostToleranceEndPoint(svc),
GetProductionOrderEndPoint(svc),
GetProductionOrdersEndPoint(svc),
PostMedicionesEndPoint(svc),
GetMedicionesEndPoint(svc),
GetMedicionEndPoint(svc),
GetUserEndPoint(svc),
CreateUserEndPoint(svc),
ValidateUserEndPoint(svc),
GetExcelEndPoint(svc),
)
return &Server{
api: api,
Url: url,
}
}