diff --git a/handlers/application/diags.go b/handlers/application/diags.go index 7c7cf9c..2b19324 100644 --- a/handlers/application/diags.go +++ b/handlers/application/diags.go @@ -201,6 +201,67 @@ func (h *ApplicationHandler) VehiclesCreateDiag(w http.ResponseWriter, r *http.R h.Renderer.VehiclesCreateDiag(w, r, vehicleID) } +func (h *ApplicationHandler) BookingsCreateDiag(w http.ResponseWriter, r *http.Request) { + vars := mux.Vars(r) + bookingID := vars["bookingid"] + + if h.services == nil || (h.services.GRPC == services.GRPCServices{}) || h.services.GRPC.Diags == nil { + log.Error().Msg("Diags service is not initialized") + http.Error(w, "Internal server error", http.StatusInternalServerError) + return + } + + + if r.Method == http.MethodPost { + g := r.Context().Value(identification.GroupKey) + if g == nil { + http.Error(w, "Missing group information", http.StatusBadRequest) + return + } + + diagForm, err := parseDiagsForm(r) + if err != nil { + log.Error().Err(err).Msg("Invalid form data") + http.Error(w, err.Error(), http.StatusBadRequest) + return + } + + log.Debug().Interface("diagForm", diagForm).Msg("Form data parsed") + + data, err := structpb.NewStruct(map[string]any{ + "booking": bookingID, + }) + if err != nil { + log.Error().Err(err).Msg("Failed to create protobuf struct") + w.WriteHeader(http.StatusInternalServerError) + return + } + + request := &diags.CreateDiagRequest{ + Diag: &diags.Diag{ + Name: diagForm.Name, + Namespace: diagForm.Namespace, + JsonSchema: diagForm.JsonSchema, + UiSchema: diagForm.UiSchema, + Data: data, + Deleted: diagForm.Deleted, + }, + } + + resp, err := h.services.GRPC.Diags.CreateDiag(context.TODO(), request) + if err != nil { + log.Error().Err(err).Msg("Failed to create diagnostic") + w.WriteHeader(http.StatusInternalServerError) + return + } + + http.Redirect(w, r, fmt.Sprintf("/app/diags/%s", resp.Diag.Id), http.StatusFound) + return + } + + h.Renderer.BookingsCreateDiag(w, r, bookingID) +} + func (h *ApplicationHandler) DiagsDisplayDiag(w http.ResponseWriter, r *http.Request) { vars := mux.Vars(r) diagid := vars["diagid"] diff --git a/handlers/application/vehicles-management.go b/handlers/application/vehicles-management.go index 7aae680..dc9b14b 100755 --- a/handlers/application/vehicles-management.go +++ b/handlers/application/vehicles-management.go @@ -63,7 +63,7 @@ func (h *ApplicationHandler) VehiclesManagementOverview(w http.ResponseWriter, r } } - driversMap, _ := h.services.GetBeneficiariesMap() + driversMap, _ := h.services.GetBeneficiariesMap() sort.Sort(sorting.VehiclesByLicencePlate(vehicles)) sort.Sort(sorting.BookingsByStartdate(bookings)) @@ -102,7 +102,7 @@ func (h *ApplicationHandler) VehiclesManagementBookingsList(w http.ResponseWrite cacheid := uuid.NewString() h.cache.PutWithTTL(cacheid, bookings, 1*time.Hour) - driversMap, _ := h.services.GetBeneficiariesMap() + driversMap, _ := h.services.GetBeneficiariesMap() h.Renderer.VehiclesManagementBookingsList(w, r, vehicles_map, driversMap, bookings, cacheid) } @@ -200,7 +200,6 @@ func (h *ApplicationHandler) VehiclesFleetDisplay(w http.ResponseWriter, r *http return } - diag := []diagsstorage.Diag{} diagsrequest := &diags.GetDiagsRequest{ @@ -358,7 +357,32 @@ func (h ApplicationHandler) VehicleManagementBookingDisplay(w http.ResponseWrite documents := h.filestorage.List(filestorage.PREFIX_BOOKINGS + "/" + bookingid) file_types_map := h.config.GetStringMapString("storage.files.file_types") - h.Renderer.VehicleManagementBookingDisplay(w, r, booking, booking.Vehicle, beneficiary, groupresp.Group.ToStorageType(), documents, file_types_map, alternatives) + diag := []diagsstorage.Diag{} + + diagsrequest := &diags.GetDiagsRequest{ + Namespaces: []string{"parcoursmob_bookings"}, + } + + diagsresp, err := h.services.GRPC.Diags.GetDiags(context.TODO(), diagsrequest) + if err != nil { + log.Error().Err(err).Msg("") + w.WriteHeader(http.StatusInternalServerError) + return + } + + for _, d := range diagsresp.Diags { + diagData := d.Data.AsMap() + if booking, ok := diagData["booking"].(string); ok && booking == bookingid { + diag = append(diag, d.ToStorageType()) + } + } + + diagsAny := make([]any, len(diag)) + for i, d := range diag { + diagsAny[i] = d + } + + h.Renderer.VehicleManagementBookingDisplay(w, r, booking, booking.Vehicle, beneficiary, groupresp.Group.ToStorageType(), documents, file_types_map, alternatives, diagsAny) } func (h ApplicationHandler) VehicleManagementBookingChangeVehicle(w http.ResponseWriter, r *http.Request) { diff --git a/main.go b/main.go index d3fdc4f..d075dd6 100755 --- a/main.go +++ b/main.go @@ -194,6 +194,8 @@ func main() { application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags", applicationHandler.DiagsHome) application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag) //////////////////////////////////////////////////////////////// + //////////////////Diag in bookings//////////////////////// + application.HandleFunc("/vehicles-management/bookings/{bookingid}/create-diag", applicationHandler.BookingsCreateDiag) //////////////////Diags//////////////////////// application.HandleFunc("/diags/", applicationHandler.DiagsHome) application.HandleFunc("/diags/{diagid}", applicationHandler.DiagsDisplayDiag) diff --git a/renderer/diags.go b/renderer/diags.go index b900e3d..3fc09e3 100644 --- a/renderer/diags.go +++ b/renderer/diags.go @@ -39,13 +39,22 @@ func (renderer *Renderer) BeneficiariesCreateDiag(w http.ResponseWriter, r *http func (renderer *Renderer) VehiclesCreateDiag(w http.ResponseWriter, r *http.Request, vehicle string) { state := NewState(r, renderer.ThemeConfig, diagsMenu) - files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.create_diag.files") + files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.create_vehicle_diag.files") state.ViewState = map[string]any{ "vehicle": vehicle, } renderer.Render("diag create for vehicle", w, r, files, state) } +func (renderer *Renderer) BookingsCreateDiag(w http.ResponseWriter, r *http.Request, booking string) { + state := NewState(r, renderer.ThemeConfig, diagsMenu) + files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.create_booking_diag.files") + state.ViewState = map[string]any{ + "booking": booking, + } + renderer.Render("diag create for booking", w, r, files, state) +} + func (renderer *Renderer) DiagsDisplayDiag(w http.ResponseWriter, r *http.Request, diag any) { files := renderer.ThemeConfig.GetStringSlice("views.diags.display_diag.files") state := NewState(r, renderer.ThemeConfig, diagsMenu) diff --git a/renderer/renderer.go b/renderer/renderer.go index ff9f206..2cc23cf 100755 --- a/renderer/renderer.go +++ b/renderer/renderer.go @@ -254,7 +254,7 @@ func NewState(r *http.Request, themeConfig *viper.Viper, menuState string) Rende } if modules["diags"] != nil && modules["diags"].(bool) { ls.MenuItems = append(ls.MenuItems, MenuItem{ - Title: "Diagnostiques", + Title: "Diagnostics", Link: "/app/diags/", Active: menuState == diagsMenu, Icon: "hero:outline/document-text", diff --git a/renderer/vehicle-management.go b/renderer/vehicle-management.go index 29ea6b3..1914d43 100755 --- a/renderer/vehicle-management.go +++ b/renderer/vehicle-management.go @@ -68,7 +68,7 @@ func (renderer *Renderer) VehiclesFleetUpdate(w http.ResponseWriter, r *http.Req renderer.Render("fleet display vehicle", w, r, files, state) } -func (renderer *Renderer) VehicleManagementBookingDisplay(w http.ResponseWriter, r *http.Request, booking any, vehicle any, beneficiary any, group any, documents []filestorage.FileInfo, file_types_map map[string]string, alternative_vehicles []any) { +func (renderer *Renderer) VehicleManagementBookingDisplay(w http.ResponseWriter, r *http.Request, booking any, vehicle any, beneficiary any, group any, documents []filestorage.FileInfo, file_types_map map[string]string, alternative_vehicles []any, diags []any) { files := renderer.ThemeConfig.GetStringSlice("views.vehicles_management.booking_display.files") state := NewState(r, renderer.ThemeConfig, vehiclesmanagementMenu) state.ViewState = map[string]any{ @@ -79,6 +79,7 @@ func (renderer *Renderer) VehicleManagementBookingDisplay(w http.ResponseWriter, "documents": documents, "file_types_map": file_types_map, "alternative_vehicles": alternative_vehicles, + "diags": diags, } renderer.Render("vehicles search", w, r, files, state)