add diags services

This commit is contained in:
Nicolas CARON 2024-12-04 09:23:45 +01:00
parent e81399eef4
commit a2a3ac5ffe
7 changed files with 161 additions and 39 deletions

View File

@ -27,6 +27,8 @@ import (
"git.coopgo.io/coopgo-platform/groups-management/storage" "git.coopgo.io/coopgo-platform/groups-management/storage"
mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage" mobilityaccountsstorage "git.coopgo.io/coopgo-platform/mobility-accounts/storage"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi"
diagsstorage "git.coopgo.io/coopgo-platform/diags/storage"
"github.com/google/uuid" "github.com/google/uuid"
"github.com/gorilla/mux" "github.com/gorilla/mux"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@ -310,6 +312,20 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
} }
sortByDate(events_list) sortByDate(events_list)
diag := []diagsstorage.Diag{}
for _, e := range diag {
diagrequest := &diags.GetDiagRequest{
Id: e.ID,
}
diagresp, err := h.services.GRPC.Diags.GetDiag(context.TODO(), diagrequest)
if err != nil {
log.Error().Err(err).Msg("")
w.WriteHeader(http.StatusInternalServerError)
return
}
diag = append(diag, diagresp.Diag.ToStorageType())
}
groupsrequest := &groupsmanagement.GetGroupsRequest{ groupsrequest := &groupsmanagement.GetGroupsRequest{
Namespaces: []string{"parcoursmob_organizations"}, Namespaces: []string{"parcoursmob_organizations"},
Member: beneficiaryID, Member: beneficiaryID,
@ -328,7 +344,11 @@ func (h *ApplicationHandler) BeneficiaryDisplay(w http.ResponseWriter, r *http.R
beneficiaries_file_types := h.config.GetStringSlice("modules.beneficiaries.documents_types") beneficiaries_file_types := h.config.GetStringSlice("modules.beneficiaries.documents_types")
file_types_map := h.config.GetStringMapString("storage.files.file_types") file_types_map := h.config.GetStringMapString("storage.files.file_types")
h.Renderer.BeneficiaryDisplay(w, r, resp.Account.ToStorageType(), bookings, organizations, beneficiaries_file_types, file_types_map, documents, events_list) diagsAny := make([]any, len(diag))
for i, d := range diag {
diagsAny[i] = d
}
h.Renderer.BeneficiaryDisplay(w, r, resp.Account.ToStorageType(), bookings, organizations, beneficiaries_file_types, file_types_map, documents, events_list, diagsAny)
} }
func (h *ApplicationHandler) BeneficiaryUpdate(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) BeneficiaryUpdate(w http.ResponseWriter, r *http.Request) {

View File

@ -2,18 +2,22 @@ package application
import ( import (
"context" "context"
// "encoding/json" "encoding/json"
"errors"
"fmt" "fmt"
// "io" // "io"
"net/http" "net/http"
// "strconv" // "strconv"
"strings" "strings"
"time" "time"
"git.coopgo.io/coopgo-apps/parcoursmob/services"
"git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification"
// filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage" // filestorage "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi" diags "git.coopgo.io/coopgo-platform/diags/grpcapi"
diagsstorage "git.coopgo.io/coopgo-platform/diags/storage" diagsstorage "git.coopgo.io/coopgo-platform/diags/storage"
// groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi" // groupsmanagement "git.coopgo.io/coopgo-platform/groups-management/grpcapi"
// "git.coopgo.io/coopgo-platform/groups-management/storage" // "git.coopgo.io/coopgo-platform/groups-management/storage"
// mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi" // mobilityaccounts "git.coopgo.io/coopgo-platform/mobility-accounts/grpcapi"
@ -75,50 +79,71 @@ func (h *ApplicationHandler) DiagsHistory(w http.ResponseWriter, r *http.Request
h.Renderer.DiagsHistory(w, r, responses) h.Renderer.DiagsHistory(w, r, responses)
} }
func (h *ApplicationHandler) DiagsCreateDiag(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) BeneficiariesCreateDiag(w http.ResponseWriter, r *http.Request) {
if r.Method == "POST" { vars := mux.Vars(r)
// Get current group beneficiaryID := vars["beneficiaryid"]
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 {
// Récupérer le groupe courant
g := r.Context().Value(identification.GroupKey) g := r.Context().Value(identification.GroupKey)
if g == nil { if g == nil {
w.WriteHeader(http.StatusBadRequest) http.Error(w, "Missing group information", http.StatusBadRequest)
return return
} }
// Parse le formulaire
diagForm, err := parseDiagsForm(r) diagForm, err := parseDiagsForm(r)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") log.Error().Err(err).Msg("Invalid form data")
w.WriteHeader(http.StatusBadRequest) http.Error(w, err.Error(), http.StatusBadRequest)
return return
} }
log.Debug().Any("diagFrom", diagForm).Msg("Form data submitted to create diag") log.Debug().Interface("diagForm", diagForm).Msg("Form data parsed")
data, _ := structpb.NewStruct(map[string]any{ // Préparation des données supplémentaires
data, err := structpb.NewStruct(map[string]any{
"beneficiary": beneficiaryID,
}) })
request := &diags.CreateDiagRequest{
Diag: &diags.Diag{
Namespace: "parcoursmob_diagnostiques",
Name: diagForm.Name,
JsonSchema: diagForm.JsonSchema,
Data: data,
Deleted: false,
},
}
resp, err := h.services.GRPC.Diags.CreateDiag(context.TODO(), request)
if err != nil { if err != nil {
log.Error().Err(err).Msg("") log.Error().Err(err).Msg("Failed to create protobuf struct")
w.WriteHeader(http.StatusInternalServerError) w.WriteHeader(http.StatusInternalServerError)
return return
} }
// Crée la requête gRPC pour créer le diagnostic
request := &diags.CreateDiagRequest{
Diag: &diags.Diag{
Name: diagForm.Name,
Namespace: diagForm.Namespace,
JsonSchema: diagForm.JsonSchema,
UiSchema: diagForm.UiSchema,
Data: data,
Deleted: diagForm.Deleted,
},
}
http.Redirect(w, r, fmt.Sprintf("/app/diags/%s", resp.Diag.Id), http.StatusFound) // Appelle le service gRPC
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
}
// Redirection après succès
http.Redirect(w, r, fmt.Sprintf("/app/benefeciaries/%s", resp.Diag), http.StatusFound)
return return
} }
h.Renderer.DiagsCreateDiag(w, r) h.Renderer.BeneficiariesCreateDiag(w, r, beneficiaryID)
} }
func (h *ApplicationHandler) DiagsDisplayDiag(w http.ResponseWriter, r *http.Request) { func (h *ApplicationHandler) DiagsDisplayDiag(w http.ResponseWriter, r *http.Request) {
@ -153,12 +178,24 @@ func parseDiagsForm(r *http.Request) (*DiagsForm, error) {
} }
formData := &DiagsForm{ formData := &DiagsForm{
Name: r.PostFormValue("name"), Name: r.PostFormValue("name"),
Namespace: "parcoursmob_diagnostiques", Namespace: r.PostFormValue("namespace"), // Récupère le namespace
JsonSchema: r.PostFormValue("json_schema"), JsonSchema: r.PostFormValue("json_schema"),
UiSchema: r.PostFormValue("ui_schema"), UiSchema: r.PostFormValue("ui_schema"),
Data: map[string]any{}, Deleted: false,
Deleted: false, }
if formData.Name == "" || formData.Namespace == "" {
return nil, errors.New("missing required fields: 'name' or 'namespace'")
}
// Gestion de la valeur JSON dans `data`
if rawData := r.PostFormValue("data"); rawData != "" {
data := map[string]any{}
if err := json.Unmarshal([]byte(rawData), &data); err != nil {
return nil, errors.New("invalid 'data' field: must be a valid JSON object")
}
formData.Data = data
} }
return formData, nil return formData, nil

View File

@ -179,7 +179,7 @@ func main() {
application.HandleFunc("/agenda/{eventid}/documents/{document}", applicationHandler.EventDocumentDownload) application.HandleFunc("/agenda/{eventid}/documents/{document}", applicationHandler.EventDocumentDownload)
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
//////////////////Diag in event//////////////////////// //////////////////Diag in event////////////////////////
application.HandleFunc("/agenda/{eventid}/create-diag", applicationHandler.DiagsCreateDiag) // application.HandleFunc("/agenda/{eventid}/create-diag", applicationHandler.DiagsCreateDiag)
application.HandleFunc("/agenda/{eventid}/diags", applicationHandler.DiagsHome) application.HandleFunc("/agenda/{eventid}/diags", applicationHandler.DiagsHome)
application.HandleFunc("/agenda/{eventid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag) application.HandleFunc("/agenda/{eventid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag)
application.HandleFunc("/agenda/{eventid}/diags/{diagid}/update", applicationHandler.DiagsUpdateDiag) application.HandleFunc("/agenda/{eventid}/diags/{diagid}/update", applicationHandler.DiagsUpdateDiag)
@ -188,7 +188,7 @@ func main() {
application.HandleFunc("/agenda/{eventid}/diags/{diagid}/history", applicationHandler.DiagsHistoryDiag) application.HandleFunc("/agenda/{eventid}/diags/{diagid}/history", applicationHandler.DiagsHistoryDiag)
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
//////////////////Diag in benefeciaries//////////////////////// //////////////////Diag in benefeciaries////////////////////////
application.HandleFunc("/beneficiaries/{beneficiaryid}/create-diag", applicationHandler.DiagsCreateDiag) application.HandleFunc("/beneficiaries/{beneficiaryid}/create-diag", applicationHandler.BeneficiariesCreateDiag)
application.HandleFunc("/beneficiaries/{beneficiaryid}/diags", applicationHandler.DiagsHome) application.HandleFunc("/beneficiaries/{beneficiaryid}/diags", applicationHandler.DiagsHome)
application.HandleFunc("/beneficiaries/{beneficiaryid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag) application.HandleFunc("/beneficiaries/{beneficiaryid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag)
application.HandleFunc("/beneficiaries/{beneficiaryid}/diags/{diagid}/update", applicationHandler.DiagsUpdateDiag) application.HandleFunc("/beneficiaries/{beneficiaryid}/diags/{diagid}/update", applicationHandler.DiagsUpdateDiag)
@ -196,7 +196,7 @@ func main() {
application.HandleFunc("/beneficiaries/{beneficiaryid}/diags/history", applicationHandler.DiagsHistory) application.HandleFunc("/beneficiaries/{beneficiaryid}/diags/history", applicationHandler.DiagsHistory)
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
//////////////////Diag in vehicules//////////////////////// //////////////////Diag in vehicules////////////////////////
application.HandleFunc("/vehicles-management/fleet/{vehicleid}/create-diag", applicationHandler.DiagsCreateDiag) // application.HandleFunc("/vehicles-management/fleet/{vehicleid}/create-diag", applicationHandler.DiagsCreateDiag)
application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags", applicationHandler.DiagsHome) application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags", applicationHandler.DiagsHome)
application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag) application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag)
application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags/{diagid}/update", applicationHandler.DiagsUpdateDiag) application.HandleFunc("/vehicles-management/fleet/{vehicleid}/diags/{diagid}/update", applicationHandler.DiagsUpdateDiag)

View File

@ -53,7 +53,7 @@ type BeneficiariesDisplayState struct {
Beneficiary any Beneficiary any
} }
func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Request, beneficiary any, bookings []fleetsstorage.Booking, organizations []any, beneficiaries_file_types []string, file_types_map map[string]string, documents any, event interface{}) { func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Request, beneficiary any, bookings []fleetsstorage.Booking, organizations []any, beneficiaries_file_types []string, file_types_map map[string]string, documents any, event interface{}, diags []any) {
files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.display.files") files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.display.files")
state := NewState(r, renderer.ThemeConfig, beneficiariesMenu) state := NewState(r, renderer.ThemeConfig, beneficiariesMenu)
state.ViewState = map[string]any{ state.ViewState = map[string]any{
@ -64,6 +64,7 @@ func (renderer *Renderer) BeneficiaryDisplay(w http.ResponseWriter, r *http.Requ
"documents": documents, "documents": documents,
"organizations": organizations, "organizations": organizations,
"event": event, "event": event,
"diags": diags,
} }
renderer.Render("beneficiaries_display", w, r, files, state) renderer.Render("beneficiaries_display", w, r, files, state)
} }

View File

@ -28,11 +28,13 @@ func (renderer *Renderer) DiagsHistory(w http.ResponseWriter, r *http.Request, d
renderer.Render("diags history", w, r, files, state) renderer.Render("diags history", w, r, files, state)
} }
func (renderer *Renderer) DiagsCreateDiag(w http.ResponseWriter, r *http.Request) { func (renderer *Renderer) BeneficiariesCreateDiag(w http.ResponseWriter, r *http.Request, beneficiary string) {
state := NewState(r, renderer.ThemeConfig, diagsMenu) state := NewState(r, renderer.ThemeConfig, diagsMenu)
files := renderer.ThemeConfig.GetStringSlice("views.diags.create_diag.files") files := renderer.ThemeConfig.GetStringSlice("views.beneficiaries.create_diag.files")
state.ViewState = map[string]any{
renderer.Render("diags create diag", w, r, files, state) "beneficiary": beneficiary,
}
renderer.Render("diag create for beneficiary", w, r, files, state)
} }
func (renderer *Renderer) DiagsDisplayDiag(w http.ResponseWriter, r *http.Request, diag any) { func (renderer *Renderer) DiagsDisplayDiag(w http.ResponseWriter, r *http.Request, diag any) {

55
services/diags.go Normal file
View File

@ -0,0 +1,55 @@
package services
import (
"context"
// "time"
diags "git.coopgo.io/coopgo-platform/diags/grpcapi"
"git.coopgo.io/coopgo-platform/diags/storage"
"google.golang.org/grpc"
// "google.golang.org/protobuf/types/known/timestamppb"
)
type DiagsService struct {
diags.DiagsClient
}
func NewDiagsService(dial string) (*DiagsService, error) {
conn, err := grpc.Dial(dial, grpc.WithInsecure())
client := diags.NewDiagsClient(conn)
if err != nil {
return nil, err
}
return &DiagsService{
DiagsClient: client,
}, nil
}
func (s *ServicesHandler) GetDiagsDiags() ([]DiagsDiag, error) {
resp, err := s.GRPC.Diags.GetDiags(context.TODO(), &diags.GetDiagsRequest{
Namespaces: []string{"parcoursmob_beneficiaires", "parcoursmob_diagnostiques"},
})
if err != nil {
return nil, err
}
diags := []DiagsDiag{}
for _, e := range resp.Diags {
newDiag := DiagsDiag{
Diag: e.ToStorageType(),
}
diags = append(diags, newDiag)
}
return diags, nil
}
// Enriched types
type DiagsDiag struct {
OwnersGroups []GroupsManagementGroup
storage.Diag
}

View File

@ -27,6 +27,7 @@ func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) {
groupsManagementDial = cfg.GetString("services.grpc.groupsmanagement.dial") groupsManagementDial = cfg.GetString("services.grpc.groupsmanagement.dial")
fleetsDial = cfg.GetString("services.grpc.fleets.dial") fleetsDial = cfg.GetString("services.grpc.fleets.dial")
agendaDial = cfg.GetString("services.grpc.agenda.dial") agendaDial = cfg.GetString("services.grpc.agenda.dial")
diagsDial = cfg.GetString("services.grpc.diags.dial")
) )
mobilityAccounts, err := NewMobilityAccountService(mobilityAccountsDial) mobilityAccounts, err := NewMobilityAccountService(mobilityAccountsDial)
if err != nil { if err != nil {
@ -48,12 +49,18 @@ func NewServicesHandler(cfg *viper.Viper) (*ServicesHandler, error) {
return nil, err return nil, err
} }
diagsSvc, err := NewDiagsService(diagsDial)
if err != nil {
return nil, err
}
return &ServicesHandler{ return &ServicesHandler{
GRPC: GRPCServices{ GRPC: GRPCServices{
MobilityAccounts: mobilityAccounts, MobilityAccounts: mobilityAccounts,
GroupsManagement: groupsManagement, GroupsManagement: groupsManagement,
Fleets: fleetsSvc, Fleets: fleetsSvc,
Agenda: agendaSvc, Agenda: agendaSvc,
Diags: diagsSvc,
}, },
}, nil }, nil
} }