package main import ( "net/http" "os" "time" "github.com/rs/zerolog" "github.com/rs/zerolog/log" "github.com/gorilla/mux" "git.coopgo.io/coopgo-apps/parcoursmob/handlers/api" "git.coopgo.io/coopgo-apps/parcoursmob/handlers/api/protected" "git.coopgo.io/coopgo-apps/parcoursmob/handlers/application" "git.coopgo.io/coopgo-apps/parcoursmob/handlers/auth" "git.coopgo.io/coopgo-apps/parcoursmob/handlers/exports" "git.coopgo.io/coopgo-apps/parcoursmob/renderer" "git.coopgo.io/coopgo-apps/parcoursmob/services" "git.coopgo.io/coopgo-apps/parcoursmob/utils/identification" "git.coopgo.io/coopgo-apps/parcoursmob/utils/protectapi" cache "git.coopgo.io/coopgo-apps/parcoursmob/utils/storage" ) func main() { cfg, err := ReadConfig() if err != nil { log.Fatal().Err(err).Msg("cannot read config!") return } var ( address = cfg.GetString("server.listen") service_name = cfg.GetString("service_name") templates_public_dir = cfg.GetString("templates.public_dir") dev_env = cfg.GetBool("dev_env") ) if dev_env { log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr}) } else { zerolog.TimeFieldFormat = zerolog.TimeFormatUnix } svc, err := services.NewServicesHandler(cfg) if err != nil { log.Panic().Err(err).Msg("Error creating services handler") } kv, err := cache.NewKVHandler(cfg) if err != nil { log.Panic().Err(err).Msg("Error creating KV handler") } filestorage, _ := cache.NewFileStorage(cfg) idp, err := identification.NewIdentificationProvider(cfg, svc, kv) if err != nil { log.Panic().Err(err).Msg("Error creating identification provider") } emailing, err := renderer.NewEmailingHandler(cfg) if err != nil { log.Panic().Err(err).Msg("Error creating emailing handler") } apiHandler, _ := api.NewAPIHandler(cfg, idp, svc, kv) protectedApiHandler, _ := protected.NewProtectedAPIHandler(cfg, idp, svc, kv) applicationHandler, _ := application.NewApplicationHandler(cfg, svc, kv, filestorage, emailing) exportsHandler, _ := exports.NewExportsHandler(cfg, svc, emailing) authHandler, _ := auth.NewAuthHandler(cfg, idp, svc, kv, emailing, filestorage) r := mux.NewRouter() r.PathPrefix("/public/").Handler(http.StripPrefix("/public/", http.FileServer(http.Dir(templates_public_dir)))) r.HandleFunc("/auth/onboarding", authHandler.Onboarding) r.HandleFunc("/auth/disconnect", authHandler.Disconnect) r.HandleFunc("/auth/lost-password", authHandler.LostPasswordInit) r.HandleFunc("/auth/lost-password/recover", authHandler.LostPasswordRecover) r.HandleFunc("/auth/groups/", authHandler.Groups) r.HandleFunc("/auth/groups/switch", authHandler.GroupSwitch) r.HandleFunc("/", redirectApp) if dev_env { r.Use(trackPage) } calendars_router := r.PathPrefix("/api/calendars").Subrouter() calendars_router.HandleFunc("/global.ics", apiHandler.CalendarGlobal) calendars_router.HandleFunc("/organizations/{groupid}.ics", apiHandler.CalendarOrganizations) ext_router := r.PathPrefix("/ext").Subrouter() ext_router.HandleFunc("/st/bp/{bookingid}", applicationHandler.SolidarityTransportExternalBookingProposal) api_router := r.PathPrefix("/api").Subrouter() api_router.HandleFunc("/", apiHandler.NotFound) api_router.HandleFunc("/geo/autocomplete", apiHandler.GeoAutocomplete) api_router.HandleFunc("/cache/{cacheid}", apiHandler.GetCache) api_router.HandleFunc("/cache/{cacheid}/export", apiHandler.CacheExport) api_router.HandleFunc("/oauth2/callback", apiHandler.OAuth2Callback) protected_api_router := api_router.PathPrefix("/protected").Subrouter() protected_api_router.HandleFunc("/users", protectedApiHandler.Users) protected_api_router.Use(protectapi.ApiKey(cfg.GetString("services.api.api_key"))) interact_router := r.PathPrefix("/int").Subrouter() interact_router.HandleFunc("/", apiHandler.NotFound) application := r.PathPrefix("/app").Subrouter() application.HandleFunc("/", applicationHandler.Dashboard) application.HandleFunc("/beneficiaries/", applicationHandler.BeneficiariesList) application.HandleFunc("/beneficiaries/create", applicationHandler.BeneficiaryCreate) application.HandleFunc("/beneficiaries/{beneficiaryid}", applicationHandler.BeneficiaryDisplay) application.HandleFunc("/beneficiaries/{beneficiaryid}/update", applicationHandler.BeneficiaryUpdate) application.HandleFunc("/beneficiaries/{beneficiaryid}/archive", applicationHandler.BeneficiaryArchive) application.HandleFunc("/beneficiaries/{beneficiaryid}/unarchive", applicationHandler.BeneficiaryUnarchive) application.HandleFunc("/beneficiaries/{beneficiaryid}/documents", applicationHandler.BeneficiaryDocuments) application.HandleFunc("/beneficiaries/{beneficiaryid}/documents/{document}", applicationHandler.BeneficiaryDocumentDownload) application.HandleFunc("/beneficiaries/{beneficiaryid}/picture", applicationHandler.BeneficiaryPicture) application.HandleFunc("/wallets/{userid}/credit", applicationHandler.CreditWallet) application.HandleFunc("/members/{beneficiaryid}/picture", applicationHandler.BeneficiaryPicture) application.HandleFunc("/members/{adminid}", applicationHandler.MemberDisplay) application.HandleFunc("/members/{adminid}/update", applicationHandler.MemberUpdate) application.HandleFunc("/members/", applicationHandler.MembersList) application.HandleFunc("/journeys/", applicationHandler.JourneysSearch) application.HandleFunc("/solidarity-transport/", applicationHandler.SolidarityTransportOverview) application.HandleFunc("/solidarity-transport/drivers/create", applicationHandler.SolidarityTransportCreateDriver) application.HandleFunc("/solidarity-transport/drivers/{driverid}/update", applicationHandler.SolidarityTransportUpdateDriver) application.HandleFunc("/solidarity-transport/drivers/{driverid}/availabilities", applicationHandler.SolidarityTransportAddAvailability) application.HandleFunc("/solidarity-transport/drivers/{driverid}/archive", applicationHandler.SolidarityTransportArchiveDriver) application.HandleFunc("/solidarity-transport/drivers/{driverid}/unarchive", applicationHandler.SolidarityTransportUnarchiveDriver) application.HandleFunc("/solidarity-transport/drivers/{driverid}/documents", applicationHandler.SolidarityTransportDriverDocuments) application.HandleFunc("/solidarity-transport/drivers/{driverid}/documents/{document}", applicationHandler.SolidarityTransportDocumentDownload) application.HandleFunc("/solidarity-transport/drivers/{driverid}/availabilities/{availabilityid}/delete", applicationHandler.SolidarityTransportDeleteAvailability) application.HandleFunc("/solidarity-transport/drivers/{driverid}/journeys/{journeyid}", applicationHandler.SolidarityTransportDriverJourney) application.HandleFunc("/solidarity-transport/drivers/{driverid}/journeys/{journeyid}/noreturn", applicationHandler.SolidarityTransportDriverJourneyToggleNoreturn) application.HandleFunc("/solidarity-transport/drivers/{driverid}", applicationHandler.SolidarityTransportDriverDisplay) application.HandleFunc("/solidarity-transport/bookings/{bookingid}", applicationHandler.SolidarityTransportBookingDisplay) application.HandleFunc("/solidarity-transport/bookings/{bookingid}/confirm", applicationHandler.SolidarityTransportBookingStatus("confirm")) application.HandleFunc("/solidarity-transport/bookings/{bookingid}/cancel", applicationHandler.SolidarityTransportBookingStatus("cancel")) application.HandleFunc("/solidarity-transport/bookings/{bookingid}/waitconfirmation", applicationHandler.SolidarityTransportBookingStatus("waitconfirmation")) application.HandleFunc("/organized-carpool/", applicationHandler.OrganizedCarpoolOverview) application.HandleFunc("/organized-carpool/drivers/create", applicationHandler.OrganizedCarpoolCreateDriver) application.HandleFunc("/organized-carpool/drivers/{driverid}/trips", applicationHandler.OrganizedCarpoolAddTrip) application.HandleFunc("/organized-carpool/drivers/{driverid}/archive", applicationHandler.OrganizedCarpoolArchiveDriver) application.HandleFunc("/organized-carpool/drivers/{driverid}/unarchive", applicationHandler.OrganizedCarpoolUnarchiveDriver) application.HandleFunc("/organized-carpool/drivers/{driverid}/documents", applicationHandler.OrganizedCarpoolDriverDocuments) application.HandleFunc("/organized-carpool/drivers/{driverid}/documents/{document}", applicationHandler.OrganizedCarpoolDocumentDownload) application.HandleFunc("/organized-carpool/drivers/{driverid}/trips/{tripid}/delete", applicationHandler.OrganizedCarpoolDeleteTrip) application.HandleFunc("/organized-carpool/drivers/{driverid}", applicationHandler.OrganizedCarpoolDriverDisplay) application.HandleFunc("/organized-carpool/drivers/{driverid}/journeys/{journeyid}", applicationHandler.OrganizedCarpoolJourney) application.HandleFunc("/vehicles/", applicationHandler.VehiclesSearch) application.HandleFunc("/vehicles/bookings/", applicationHandler.VehiclesBookingsList) application.HandleFunc("/vehicles/bookings/{bookingid}", applicationHandler.VehicleBookingDisplay) application.HandleFunc("/vehicles/v/{vehicleid}/b/{beneficiaryid}", applicationHandler.Book) application.HandleFunc("/vehicles/bookings/{bookingid}/documents/{document}", applicationHandler.BookingDocumentDownload) application.HandleFunc("/vehicles-management/", applicationHandler.VehiclesManagementOverview) application.HandleFunc("/vehicles-management/fleet/add", applicationHandler.VehiclesFleetAdd) application.HandleFunc("/vehicles-management/fleet/{vehicleid}", applicationHandler.VehiclesFleetDisplay) application.HandleFunc("/vehicles-management/fleet/{vehicleid}/unavailability", applicationHandler.VehiclesFleetMakeUnavailable) application.HandleFunc("/vehicles-management/fleet/{vehicleid}/update", applicationHandler.VehiclesFleetUpdate) application.HandleFunc("/vehicles-management/bookings/", applicationHandler.VehiclesManagementBookingsList) application.HandleFunc("/vehicles-management/bookings/{bookingid}", applicationHandler.VehicleManagementBookingDisplay) application.HandleFunc("/vehicles-management/bookings/{bookingid}/change-vehicle", applicationHandler.VehicleManagementBookingChangeVehicle) /////////////////////////////////////Remove booking vehicle///////////////////////////////////////// application.HandleFunc("/vehicles-management/bookings/{bookingid}/delete", applicationHandler.UnbookingVehicle) // application.HandleFunc("/vehicles-management/bookings/{bookingid}/delete", applicationHandler.DeleteBooking) //////////////////////////////////////////////////////////////////////////////////////////////////// application.HandleFunc("/vehicles-management/bookings/{bookingid}/documents/{document}", applicationHandler.BookingDocumentDownload) application.HandleFunc("/agenda/", applicationHandler.AgendaHome) application.HandleFunc("/agenda/history", applicationHandler.AgendaHistory) application.HandleFunc("/agenda/create-event", applicationHandler.AgendaCreateEvent) application.HandleFunc("/agenda/{eventid}", applicationHandler.AgendaDisplayEvent) ///////////////////////////////Code to modify event/////////////////////// application.HandleFunc("/agenda/{eventid}/update", applicationHandler.AgendaUpdateEvent) application.HandleFunc("/agenda/{eventid}/delete", applicationHandler.AgendaDeleteEvent) ///////////////////////////////////////////////////// application.HandleFunc("/agenda/{eventid}/subscribe", applicationHandler.AgendaSubscribeEvent) application.HandleFunc("/directory/", applicationHandler.DirectoryHome) application.HandleFunc("/group/settings", applicationHandler.GroupSettingsDisplay) application.HandleFunc("/group/settings/invite-member", applicationHandler.GroupSettingsInviteMember) application.HandleFunc("/journeys/groups_covoiturage", applicationHandler.GroupsGestion) application.HandleFunc("/journeys/groups_covoiturage/create", applicationHandler.CreateGroup) application.HandleFunc("/journeys/groups_covoiturage/create/{groupid}", applicationHandler.DisplayGroupCovoiturage) application.HandleFunc("/journeys/groups_covoiturage/create/{id}/{groupid}/{memberid}", applicationHandler.UpdateGroupCovoiturage) application.HandleFunc("/sms/send", applicationHandler.SendSMS) application.HandleFunc("/support/", applicationHandler.SupportSend) appGroup := application.PathPrefix("/group_module").Subrouter() appGroup.HandleFunc("/", applicationHandler.Groups) appGroup.HandleFunc("/groups", applicationHandler.CreateGroupModule) appGroup.HandleFunc("/groups/{groupid}", applicationHandler.DisplayGroupModule) // TODO Subrouters with middlewares checking security for each module ? application.Use(idp.Middleware) application.Use(idp.GroupsMiddleware) appAdmin := application.PathPrefix("/administration").Subrouter() appAdmin.HandleFunc("/", applicationHandler.Administration) appAdmin.HandleFunc("/groups/", applicationHandler.AdministrationCreateGroup) appAdmin.HandleFunc("/groups/{groupid}", applicationHandler.AdministrationGroupDisplay) appAdmin.HandleFunc("/groups/{groupid}/invite-admin", applicationHandler.AdministrationGroupInviteAdmin) appAdmin.HandleFunc("/groups/{groupid}/invite-member", applicationHandler.AdministrationGroupInviteMember) // add statistiques appAdmin.HandleFunc("/stats/vehicles", applicationHandler.AdminStatVehicles) appAdmin.HandleFunc("/stats/bookings", applicationHandler.AdminStatBookings) appAdmin.HandleFunc("/stats/beneficaires", applicationHandler.AdminStatBeneficaires) appAdmin.HandleFunc("/stats/events", applicationHandler.AdminStatEvents) /////////////////////////////////////Delete subscriber/////////////////////////////////////////////// application.HandleFunc("/agenda/{eventid}/{subscribeid}/delete", applicationHandler.AgendaDeleteSubscribeEvent) application.HandleFunc("/agenda/{eventid}/history", applicationHandler.AgendaHistoryEvent) ///////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////Add documents in event//////////////////////// application.HandleFunc("/agenda/{eventid}/documents", applicationHandler.EventDocuments) application.HandleFunc("/agenda/{eventid}/documents/{document}", applicationHandler.EventDocumentDownload) //////////////////////////////////////////////////////////////// //////////////////Diag in event//////////////////////// // application.HandleFunc("/agenda/{eventid}/create-diag", applicationHandler.DiagsCreateDiag) application.HandleFunc("/agenda/{eventid}/diags", applicationHandler.DiagsHome) application.HandleFunc("/agenda/{eventid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag) application.HandleFunc("/agenda/{eventid}/diags/history", applicationHandler.DiagsHistory) application.HandleFunc("/agenda/{eventid}/diags/{diagid}/history", applicationHandler.DiagsHistoryDiag) //////////////////////////////////////////////////////////////// //////////////////Diag in benefeciaries//////////////////////// application.HandleFunc("/beneficiaries/{beneficiaryid}/create-diag", applicationHandler.BeneficiariesCreateDiag) application.HandleFunc("/beneficiaries/{beneficiaryid}/diags/{diagid}", applicationHandler.DiagsDisplayDiag) //////////////////////////////////////////////////////////////// //////////////////Diag in vehicules//////////////////////// application.HandleFunc("/vehicles-management/fleet/{vehicleid}/create-diag", applicationHandler.VehiclesCreateDiag) 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) application.HandleFunc("/vehicles/bookings/{vehicleid}/diags", applicationHandler.DiagsHome) application.HandleFunc("/vehicles/bookings/{bookingid}/create-diag", applicationHandler.VehicleBookingsCreateDiag) //////////////////Diags//////////////////////// application.HandleFunc("/diags/", applicationHandler.DiagsHome) application.HandleFunc("/diags/{diagid}/documents", applicationHandler.DiagsDocuments) application.HandleFunc("/diags/{diagid}/documents/{document}", applicationHandler.DiagsDocumentDownload) application.HandleFunc("/diags/{diagid}", applicationHandler.DiagsDisplayDiag) application.HandleFunc("/diags/{diagid}/update", applicationHandler.DiagUpdate) application.HandleFunc("/diags/{diagid}/delete", applicationHandler.DiagDelete) export := r.PathPrefix("/exports").Subrouter() export.HandleFunc("/fleets/bookings", exportsHandler.AllBookings) export.HandleFunc("/fleets/bookings/{groupid}", exportsHandler.Bookings) export.HandleFunc("/agenda/subscriptions", exportsHandler.Agenda("allEvents")) export.HandleFunc("/agenda/{eventid}", exportsHandler.Agenda("oneEvent")) export.Use(idp.Middleware) export.Use(idp.GroupsMiddleware) srv := &http.Server{ Handler: r, Addr: address, WriteTimeout: 30 * time.Second, ReadTimeout: 15 * time.Second, } log.Info().Str("service_name", service_name).Str("address", address).Msg("Running HTTP server") log.Fatal().Err(srv.ListenAndServe()).Msg("Failed") } func redirectApp(w http.ResponseWriter, r *http.Request) { http.Redirect(w, r, "/app/", http.StatusFound) } func trackPage(next http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { log.Trace().Str("requested_uri", r.RequestURI).Msg("New request") next.ServeHTTP(w, r.WithContext(r.Context())) }) }