package httpserver import ( "Yimaru-Backend/internal/domain" "Yimaru-Backend/internal/web_server/handlers" "context" "fmt" "strconv" "github.com/gofiber/fiber/v2" fiberSwagger "github.com/swaggo/fiber-swagger" ) func (a *App) initAppRoutes() { h := handlers.New( a.assessmentSvc, a.courseSvc, a.arifpaySvc, a.logger, a.settingSvc, a.NotidicationStore, a.validator, a.recommendationSvc, a.userSvc, a.transactionSvc, a.authSvc, a.JwtConfig, a.cfg, a.mongoLoggerSvc, ) a.fiber.Get("/", func(c *fiber.Ctx) error { return c.JSON(fiber.Map{ "message": "Welcome to Yimaru Backend API", "version": a.cfg.APP_VERSION, }) }) a.fiber.Get("/routes", func(c *fiber.Ctx) error { return c.JSON(a.fiber.Stack()) // prints all registered routes }) // Groups groupV1 := a.fiber.Group("/api/v1") // tenant := groupV1.Group("/tenant/:tenant_slug", a.TenantMiddleware) // groupV1.Get("/test", a.authMiddleware, a.authMiddleware, func(c *fiber.Ctx) error { // fmt.Printf("\nTest Route %v\n", c.Route().Path) // companyID := c.Locals("company_id").(domain.ValidInt64) // if !companyID.Valid { // h.BadRequestLogger().Error("invalid company id") // return fiber.NewError(fiber.StatusBadRequest, "invalid company id") // } // fmt.Printf("In the tenant auth test \n") // return c.JSON(fiber.Map{ // "message": "Is is fine", // }) // }) // groupV1.Get("/", func(c *fiber.Ctx) error { // fmt.Printf("\nTenant Route %v\n", c.Route().Path) // companyID := c.Locals("company_id").(domain.ValidInt64) // if !companyID.Valid { // h.BadRequestLogger().Error("invalid company id") // return fiber.NewError(fiber.StatusBadRequest, "invalid company id") // } // return c.JSON(fiber.Map{ // "message": "Company Tenant Active", // }) // }) // Get S groupV1.Get("/tenant", a.authMiddleware, h.GetTenantSlugByToken) // Swagger a.fiber.Get("/swagger/*", fiberSwagger.FiberWrapHandler()) groupV1.Get("/", func(c *fiber.Ctx) error { return c.JSON(fiber.Map{ "message": "Welcome to Yimaru Backend API v1", "version": "1.0.1", }) }) // Assessment questions groupV1.Post("/assessment/questions", h.CreateAssessmentQuestion) groupV1.Get("/assessment/questions", h.ListAssessmentQuestions) groupV1.Get("/assessment/questions/:id", h.GetAssessmentQuestionByID) // groupV1.Put("/assessment/questions/:id", h.UpdateAssessmentQuestion) // groupV1.Delete("/assessment/questions/:id", h.DeleteAssessmentQuestion) // Start a new assessment attempt // groupV1.Post( // "/assessment/attempts", // h.StartAssessmentAttempt, // ) // // Submit or update an answer // groupV1.Post( // "/assessment/attempts/:attempt_id/answers", // h.SubmitAssessmentAnswer, // ) // // Final submission (locks answers) // groupV1.Post( // "/assessment/attempts/:attempt_id/submit", // h.SubmitAssessmentAttempt, // ) // // Get attempt details // groupV1.Get( // "/assessment/attempts/:attempt_id", // h.GetAssessmentAttemptByID, // ) // Get final result + answers // groupV1.Get( // "/assessment/attempts/:attempt_id/result", // h.GetAssessmentResult, // ) // // Evaluate attempt (admin / system) // groupV1.Post( // "/assessment/attempts/:attempt_id/evaluate", // h.EvaluateAssessmentAttempt, // ) // Course Management Routes groupV1.Post("/course-categories", h.CreateCourseCategory) groupV1.Get("/course-categories", h.ListActiveCourseCategories) groupV1.Get("/course-categories/:id", h.GetCourseCategoryByID) groupV1.Put("/course-categories/:id", h.UpdateCourseCategory) groupV1.Post("/course-categories/:id/deactivate", h.DeactivateCourseCategory) groupV1.Post("/courses", h.CreateCourse) groupV1.Get("/courses", h.ListActiveCourses) groupV1.Get("/courses/:id", h.GetCourseByID) groupV1.Put("/courses/:id", h.UpdateCourse) groupV1.Post("/courses/:id/deactivate", h.DeactivateCourse) groupV1.Get("/course-categories/:category_id/courses", h.ListCoursesByCategory) groupV1.Post("/courses/:course_id/programs", h.CreateProgram) groupV1.Get("/courses/:course_id/programs", h.ListProgramsByCourse) groupV1.Post("/modules", h.CreateModule) groupV1.Get("/levels/:level_id/modules", h.ListModulesByLevel) groupV1.Post("/module-videos", h.CreateModuleVideo) groupV1.Post("/practices", h.CreatePractice) groupV1.Post("/practice-questions", h.CreatePracticeQuestion) groupV1.Post("/levels", h.CreateLevel) // Auth Routes groupV1.Post("/auth/google/android", h.GoogleAndroidLogin) groupV1.Get("/auth/google/login", h.GoogleLogin) groupV1.Get("/auth/google/callback", h.GoogleCallback) groupV1.Post("/auth/customer-login", h.LoginUser) groupV1.Post("/auth/admin-login", h.LoginAdmin) groupV1.Post("/auth/super-login", h.LoginSuper) groupV1.Post("/auth/refresh", h.RefreshToken) groupV1.Post("/auth/logout", a.authMiddleware, h.LogOutuser) groupV1.Get("/auth/test", a.authMiddleware, func(c *fiber.Ctx) error { userID, ok := c.Locals("user_id").(int64) if !ok { return fiber.NewError(fiber.StatusUnauthorized, "Invalid user ID") } role, ok := c.Locals("role").(domain.Role) if !ok { return fiber.NewError(fiber.StatusUnauthorized, "Invalid role") } refreshToken, ok := c.Locals("refresh_token").(string) if !ok { return fiber.NewError(fiber.StatusUnauthorized, "Invalid refresh token") } companyID, err := strconv.ParseInt(c.Get("company_id"), 10, 64) if err != nil { return fiber.NewError(fiber.StatusBadRequest, "Invalid company_id") } a.logger.Info("User ID: " + strconv.FormatInt(userID, 10)) fmt.Printf("User ID: %d\n", userID) a.logger.Info("Role: " + string(role)) a.logger.Info("Refresh Token: " + refreshToken) a.logger.Info("Company ID: " + strconv.FormatInt(companyID, 10)) return c.SendString("Test endpoint") }) //Arifpay // groupV1.Post("/arifpay/checkout", a.authMiddleware, h.CreateCheckoutSessionHandler) // groupV1.Post("/arifpay/checkout/cancel/:sessionId", a.authMiddleware, h.CancelCheckoutSessionHandler) // groupV1.Post("/api/v1/arifpay/c2b-webhook", h.HandleArifpayC2BWebhook) // groupV1.Post("/api/v1/arifpay/b2c-webhook", h.HandleArifpayB2CWebhook) // groupV1.Post("/arifpay/b2c/transfer", a.authMiddleware, h.ExecuteArifpayB2CTransfer) // groupV1.Post("/arifpay/transaction-id/verify-transaction", a.authMiddleware, h.ArifpayVerifyByTransactionIDHandler) // groupV1.Get("/arifpay/session-id/verify-transaction/:session_id", a.authMiddleware, h.ArifpayVerifyBySessionIDHandler) // groupV1.Get("/arifpay/payment-methods", a.authMiddleware, h.GetArifpayPaymentMethodsHandler // User Routes groupV1.Get("/user/:user_id/is-profile-completed", a.authMiddleware, h.CheckProfileCompleted) groupV1.Get("/users", a.authMiddleware, h.GetAllUsers) groupV1.Put("/user", a.authMiddleware, h.UpdateUser) groupV1.Put("/user/knowledge-level", h.UpdateUserKnowledgeLevel) // groupV1.Get("/user/:user_name/is-unique", h.CheckUserNameUnique) groupV1.Get("/user/:user_name/is-pending", h.CheckUserPending) groupV1.Post("/user/resetPassword", h.ResetPassword) groupV1.Post("/user/sendResetCode", h.SendResetCode) groupV1.Post("/user/verify-otp", h.VerifyOtp) groupV1.Post("/user/resend-otp", h.ResendOtp) groupV1.Post("/user/resetPassword", h.ResetTenantPassword) groupV1.Post("/user/sendResetCode", h.SendTenantResetCode) groupV1.Post("/user/register", h.RegisterUser) groupV1.Post("/user/sendRegisterCode", h.SendRegisterCode) groupV1.Post("/user/checkPhoneEmailExist", h.CheckPhoneEmailExist) groupV1.Get("/user/admin-profile", a.authMiddleware, h.AdminProfile) groupV1.Get("/user/user-profile", a.authMiddleware, h.GetUserProfile) groupV1.Get("/user/single/:id", a.authMiddleware, h.GetUserByID) groupV1.Delete("/user/delete/:id", a.authMiddleware, h.DeleteUser) groupV1.Post("/user/search", a.authMiddleware, h.SearchUserByNameOrPhone) groupV1.Get("/admin", a.authMiddleware, a.SuperAdminOnly, h.GetAllAdmins) groupV1.Get("/admin/:id", a.authMiddleware, a.SuperAdminOnly, h.GetAdminByID) groupV1.Post("/admin", a.authMiddleware, a.SuperAdminOnly, h.CreateAdmin) groupV1.Put("/admin/:id", a.authMiddleware, a.SuperAdminOnly, h.UpdateAdmin) // groupV1.Get("/t-approver", a.authMiddleware, a.OnlyAdminAndAbove, h.GetAllTransactionApprovers) // groupV1.Get("/t-approver/:id", a.authMiddleware, a.OnlyAdminAndAbove, h.GetTransactionApproverByID) // groupV1.Post("/t-approver", a.authMiddleware, a.OnlyAdminAndAbove, h.CreateTransactionApprover) // groupV1.Put("/t-approver/:id", a.authMiddleware, a.OnlyAdminAndAbove, h.UpdateTransactionApprover) //mongoDB logs groupV1.Get("/logs", a.authMiddleware, a.SuperAdminOnly, handlers.GetLogsHandler(context.Background())) // groupV1.Get("/shop/transaction", a.authMiddleware, a.CompanyOnly, h.GetAllTransactions) // groupV1.Get("/shop/transaction/:id", a.authMiddleware, a.CompanyOnly, h.GetTransactionByID) // groupV1.Get("/shop/transaction/:id/bet", a.authMiddleware, a.CompanyOnly, h.GetShopBetByTransactionID) // groupV1.Put("/shop/transaction/:id", a.authMiddleware, a.CompanyOnly, h.UpdateTransactionVerified) // Notification Routes groupV1.Post("/sendSMS", h.SendSingleAfroSMS) groupV1.Get("/ws/connect", a.WebsocketAuthMiddleware, h.ConnectSocket) groupV1.Get("/notifications", a.authMiddleware, h.GetUserNotification) groupV1.Get("/notifications/all", a.authMiddleware, h.GetAllNotifications) // groupV1.Post("/notifications/mark-as-read", a.authMiddleware, h.MarkNotificationAsRead) groupV1.Get("/notifications/unread", a.authMiddleware, h.CountUnreadNotifications) groupV1.Post("/notifications/create", a.authMiddleware, h.CreateAndSendNotification) //Issue Reporting Routes // groupV1.Post("/issues", a.authMiddleware, h.CreateIssue) //anyone who has logged can report a // groupV1.Get("/issues/customer/:customer_id", a.authMiddleware, a.OnlyAdminAndAbove, h.GetUserIssues) // groupV1.Get("/issues", a.authMiddleware, a.OnlyAdminAndAbove, h.GetAllIssues) // groupV1.Patch("/issues/:issue_id/status", a.authMiddleware, a.OnlyAdminAndAbove, h.UpdateIssueStatus) // groupV1.Delete("/issues/:issue_id", a.authMiddleware, a.OnlyAdminAndAbove, h.DeleteIssue) // Settings groupV1.Get("/settings", a.authMiddleware, a.SuperAdminOnly, h.GetGlobalSettingList) groupV1.Get("/settings/:key", a.authMiddleware, a.SuperAdminOnly, h.GetGlobalSettingByKey) groupV1.Put("/settings", a.authMiddleware, a.SuperAdminOnly, h.UpdateGlobalSettingList) }