mirror of
https://github.com/Floriansylvain/RenewCMS.git
synced 2026-08-19 11:43:22 +02:00
refac: fixed, better, smarter, correct dependency injection
This commit is contained in:
@@ -34,7 +34,7 @@ const LogsErrorMessage = "Access to the requested resource is forbidden due to i
|
||||
const BodyErrorMessage = "The request cannot be processed due to a mismatch in the format of the body."
|
||||
|
||||
func SetJwtCookie(w *http.ResponseWriter, userId uint32) error {
|
||||
_, tokenString, err := Token.Encode(map[string]interface{}{"user_id": userId})
|
||||
_, tokenString, err := Token.Encode(map[string]any{"user_id": userId})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -138,7 +138,7 @@ func login(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
_ = SetJwtCookie(&w, dbUser.ID)
|
||||
|
||||
message, _ := json.Marshal(map[string]interface{}{"message": "User logged in! HTTPonly jwt cookie created"})
|
||||
message, _ := json.Marshal(map[string]any{"message": "User logged in! HTTPonly jwt cookie created"})
|
||||
_, _ = w.Write(message)
|
||||
}
|
||||
|
||||
@@ -170,7 +170,7 @@ func register(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
_ = SetJwtCookie(&w, createdUser.ID)
|
||||
|
||||
message, _ := json.Marshal(map[string]interface{}{"message": "User registered! HTTPonly jwt cookie created"})
|
||||
message, _ := json.Marshal(map[string]any{"message": "User registered! HTTPonly jwt cookie created"})
|
||||
_, _ = w.Write(message)
|
||||
}
|
||||
|
||||
@@ -188,7 +188,7 @@ func RemoveJwtCookie(w http.ResponseWriter) {
|
||||
|
||||
func logout(w http.ResponseWriter, _ *http.Request) {
|
||||
RemoveJwtCookie(w)
|
||||
message, _ := json.Marshal(map[string]interface{}{"message": "User logged out! HTTPonly jwt cookie deleted"})
|
||||
message, _ := json.Marshal(map[string]any{"message": "User logged out! HTTPonly jwt cookie deleted"})
|
||||
_, _ = w.Write(message)
|
||||
}
|
||||
|
||||
|
||||
@@ -33,7 +33,7 @@ func PostImage(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
newJson := map[string]interface{}{"location": newImage.Path}
|
||||
newJson := map[string]any{"location": newImage.Path}
|
||||
newJsonBytes, _ := json.Marshal(newJson)
|
||||
|
||||
_, _ = w.Write(newJsonBytes)
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
|
||||
func GetHomePage(w http.ResponseWriter, _ *http.Request) {
|
||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
||||
homeTmpl, _ := api.Container.GetPageUseCase.GetPage("home", map[string]interface{}{
|
||||
homeTmpl, _ := api.Container.GetPageUseCase.GetPage("home", map[string]any{
|
||||
"Navbar": template.HTML(navbarTmpl),
|
||||
"Head": headTmpl,
|
||||
})
|
||||
|
||||
@@ -9,7 +9,7 @@ import (
|
||||
|
||||
func GetPageIntegration(w http.ResponseWriter, r *http.Request) {
|
||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
||||
templ, _ := api.Container.GetPageUseCase.GetPage("integration", map[string]interface{}{
|
||||
templ, _ := api.Container.GetPageUseCase.GetPage("integration", map[string]any{
|
||||
"Navbar": template.HTML(navbarTmpl),
|
||||
"Head": headTmpl,
|
||||
"Host": os.Getenv("HOST"),
|
||||
|
||||
@@ -35,7 +35,7 @@ func GetLoginPageHandler(loginPage *LoginPage) http.HandlerFunc {
|
||||
}
|
||||
success, _ := url.QueryUnescape(r.URL.Query().Get("success"))
|
||||
failure, _ := url.QueryUnescape(r.URL.Query().Get("failure"))
|
||||
bs, _ := api.Container.GetPageUseCase.GetPage("login", map[string]interface{}{
|
||||
bs, _ := api.Container.GetPageUseCase.GetPage("login", map[string]any{
|
||||
"PageError": loginPage.PageError,
|
||||
"Username": loginPage.Username,
|
||||
"Head": headTmpl,
|
||||
|
||||
@@ -18,7 +18,7 @@ func GetPasswordResetRequest(w http.ResponseWriter, r *http.Request) {
|
||||
success := r.URL.Query().Get("success")
|
||||
email := r.URL.Query().Get("email")
|
||||
|
||||
bs, _ := api.Container.GetPageUseCase.GetPage("passwordResetRequest", map[string]interface{}{
|
||||
bs, _ := api.Container.GetPageUseCase.GetPage("passwordResetRequest", map[string]any{
|
||||
"Head": headTmpl,
|
||||
"Email": email,
|
||||
"Success": success,
|
||||
|
||||
@@ -16,7 +16,7 @@ func GetPasswordResetValidate(w http.ResponseWriter, r *http.Request) {
|
||||
if failure != "" {
|
||||
pageError = NewPageError(failure)
|
||||
}
|
||||
template, _ := api.Container.GetPageUseCase.GetPage("passwordResetValidate", map[string]interface{}{
|
||||
template, _ := api.Container.GetPageUseCase.GetPage("passwordResetValidate", map[string]any{
|
||||
"Head": headTmpl,
|
||||
"Error": pageError,
|
||||
"Email": r.URL.Query().Get("email"),
|
||||
|
||||
@@ -16,7 +16,7 @@ type PostCreatePageError struct {
|
||||
|
||||
func GetPostCreatePageTemplate(postName string, errorMessage string) ([]byte, error) {
|
||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
||||
return api.Container.GetPageUseCase.GetPage("postCreate", map[string]interface{}{
|
||||
return api.Container.GetPageUseCase.GetPage("postCreate", map[string]any{
|
||||
"Navbar": template.HTML(navbarTmpl),
|
||||
"Head": headTmpl,
|
||||
"PageError": PostCreatePageError{
|
||||
|
||||
@@ -18,7 +18,7 @@ type PostEditPageAlert struct {
|
||||
|
||||
func getPostEditPageTemplate(post post.Post, alert PostEditPageAlert) []byte {
|
||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
||||
postTmpl, _ := api.Container.GetPageUseCase.GetPage("postEdit", map[string]interface{}{
|
||||
postTmpl, _ := api.Container.GetPageUseCase.GetPage("postEdit", map[string]any{
|
||||
"Navbar": template.HTML(navbarTmpl),
|
||||
"Head": headTmpl,
|
||||
"Post": post,
|
||||
|
||||
@@ -9,9 +9,9 @@ import (
|
||||
func GetPostsPage(w http.ResponseWriter, _ *http.Request) {
|
||||
posts := api.Container.ListPostsUseCase.ListPosts()
|
||||
|
||||
var formattedPosts []map[string]interface{}
|
||||
var formattedPosts []map[string]any
|
||||
for _, post := range posts {
|
||||
formattedPosts = append(formattedPosts, map[string]interface{}{
|
||||
formattedPosts = append(formattedPosts, map[string]any{
|
||||
"ID": post.ID,
|
||||
"Title": post.Title,
|
||||
"IsOnline": post.IsOnline,
|
||||
@@ -21,7 +21,7 @@ func GetPostsPage(w http.ResponseWriter, _ *http.Request) {
|
||||
}
|
||||
|
||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
||||
postsTmpl, _ := api.Container.GetPageUseCase.GetPage("posts", map[string]interface{}{
|
||||
postsTmpl, _ := api.Container.GetPageUseCase.GetPage("posts", map[string]any{
|
||||
"Navbar": template.HTML(navbarTmpl),
|
||||
"Head": headTmpl,
|
||||
"Posts": formattedPosts,
|
||||
|
||||
@@ -44,7 +44,7 @@ func GetRegisterPageHandler(registerPage *RegisterPage) http.HandlerFunc {
|
||||
PostRegisterPage(w, r)
|
||||
return
|
||||
}
|
||||
bs, err := api.Container.GetPageUseCase.GetPage("register", map[string]interface{}{
|
||||
bs, err := api.Container.GetPageUseCase.GetPage("register", map[string]any{
|
||||
"PageError": registerPage.PageError,
|
||||
"Username": registerPage.Username,
|
||||
"Email": registerPage.Email,
|
||||
|
||||
@@ -29,7 +29,7 @@ func PostRegisterPendingPage(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
|
||||
func GetRegisterPendingPage(w http.ResponseWriter, _ *http.Request) {
|
||||
registerPendingTmpl, _ := api.Container.GetPageUseCase.GetPage("registerPending", map[string]interface{}{
|
||||
registerPendingTmpl, _ := api.Container.GetPageUseCase.GetPage("registerPending", map[string]any{
|
||||
"Head": headTmpl,
|
||||
})
|
||||
_, _ = w.Write(registerPendingTmpl)
|
||||
|
||||
@@ -38,7 +38,7 @@ func GetRegisterValidatePage(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
registerValidateTmpl, _ := api.Container.GetPageUseCase.GetPage("registerValidate", map[string]interface{}{
|
||||
registerValidateTmpl, _ := api.Container.GetPageUseCase.GetPage("registerValidate", map[string]any{
|
||||
"Head": headTmpl,
|
||||
"PageError": NewPageError(errorMessage),
|
||||
})
|
||||
|
||||
+81
-23
@@ -1,15 +1,42 @@
|
||||
package api
|
||||
|
||||
import (
|
||||
"GoCMS/adapters/secondary/gateways"
|
||||
"GoCMS/adapters/secondary/gateways/models"
|
||||
"GoCMS/useCases"
|
||||
"fmt"
|
||||
"os"
|
||||
"path/filepath"
|
||||
"reflect"
|
||||
"runtime"
|
||||
|
||||
"github.com/glebarez/sqlite"
|
||||
"go.uber.org/dig"
|
||||
"gorm.io/gorm"
|
||||
"os"
|
||||
"path/filepath"
|
||||
)
|
||||
|
||||
type UseCaseDefinition struct {
|
||||
Constructor interface{}
|
||||
FieldName string
|
||||
}
|
||||
|
||||
var useCaseDefinitions = []UseCaseDefinition{
|
||||
{useCases.NewCreatePostUseCase, "CreatePostUseCase"},
|
||||
{useCases.NewGetPostUseCase, "GetPostUseCase"},
|
||||
{useCases.NewListPostsUseCase, "ListPostsUseCase"},
|
||||
{useCases.NewUpdatePostUseCase, "UpdatePostUseCase"},
|
||||
{useCases.NewDeletePostUseCase, "DeletePostUseCase"},
|
||||
{useCases.NewGetUserUseCase, "GetUserUseCase"},
|
||||
{useCases.NewCreateUserUseCase, "CreateUserUseCase"},
|
||||
{useCases.NewUpdateUserUseCase, "UpdateUserUseCase"},
|
||||
{useCases.NewDeleteUserUseCase, "DeleteUserUseCase"},
|
||||
{useCases.NewListUsersUseCase, "ListUsersUseCase"},
|
||||
{useCases.NewGetPageUseCase, "GetPageUseCase"},
|
||||
{useCases.NewSendMailUseCase, "SendMailUseCase"},
|
||||
{useCases.NewCreateImageUseCase, "CreateImageUseCase"},
|
||||
{useCases.NewDeleteImageUseCase, "DeleteImageUseCase"},
|
||||
}
|
||||
|
||||
type UseCases struct {
|
||||
CreatePostUseCase *useCases.CreatePostUseCase
|
||||
GetPostUseCase *useCases.GetPostUseCase
|
||||
@@ -45,29 +72,60 @@ func InitContainer() {
|
||||
digContainer := dig.New()
|
||||
|
||||
database := getDb()
|
||||
_ = database.AutoMigrate(&models.Post{}, &models.User{})
|
||||
_ = digContainer.Provide(func() *gorm.DB { return database })
|
||||
if err := database.AutoMigrate(&models.Post{}, &models.User{}); err != nil {
|
||||
panic("Failed to migrate database: " + err.Error())
|
||||
}
|
||||
|
||||
_ = digContainer.Provide(func(db *gorm.DB) *UseCases {
|
||||
return &UseCases{
|
||||
CreatePostUseCase: useCases.NewCreatePostUseCase(db),
|
||||
GetPostUseCase: useCases.NewGetPostUseCase(db),
|
||||
ListPostsUseCase: useCases.NewListPostsUseCase(db),
|
||||
UpdatePostUseCase: useCases.NewUpdatePostUseCase(db),
|
||||
DeletePostUseCase: useCases.NewDeletePostUseCase(db),
|
||||
GetUserUseCase: useCases.NewGetUserUseCase(db),
|
||||
CreateUserUseCase: useCases.NewCreateUserUseCase(db),
|
||||
UpdateUserUseCase: useCases.NewUpdateUserUseCase(db),
|
||||
DeleteUserUseCase: useCases.NewDeleteUserUseCase(db),
|
||||
ListUsersUseCase: useCases.NewListUsersUseCase(db),
|
||||
GetPageUseCase: useCases.NewGetPageUseCase(),
|
||||
SendMailUseCase: useCases.NewSendMailUseCase(),
|
||||
CreateImageUseCase: useCases.NewCreateImageUseCase(db),
|
||||
DeleteImageUseCase: useCases.NewDeleteImageUseCase(db),
|
||||
if err := digContainer.Provide(func() *gorm.DB { return database }); err != nil {
|
||||
panic("Failed to provide database: " + err.Error())
|
||||
}
|
||||
|
||||
provideRepositories(digContainer)
|
||||
|
||||
for _, def := range useCaseDefinitions {
|
||||
if err := digContainer.Provide(def.Constructor); err != nil {
|
||||
funcName := runtime.FuncForPC(reflect.ValueOf(def.Constructor).Pointer()).Name()
|
||||
panic(fmt.Sprintf("Failed to provide %s: %v", funcName, err))
|
||||
}
|
||||
})
|
||||
err := digContainer.Invoke(func(useCases *UseCases) { Container = useCases })
|
||||
if err != nil {
|
||||
}
|
||||
|
||||
if err := digContainer.Provide(func(values ...any) *UseCases {
|
||||
container := &UseCases{}
|
||||
containerValue := reflect.ValueOf(container).Elem()
|
||||
|
||||
for i, value := range values {
|
||||
fieldName := useCaseDefinitions[i].FieldName
|
||||
field := containerValue.FieldByName(fieldName)
|
||||
if field.IsValid() && field.CanSet() {
|
||||
field.Set(reflect.ValueOf(value))
|
||||
} else {
|
||||
panic(fmt.Sprintf("Failed to set field %s", fieldName))
|
||||
}
|
||||
}
|
||||
|
||||
return container
|
||||
}, dig.As(new(*UseCases))); err != nil {
|
||||
panic("Failed to provide container constructor: " + err.Error())
|
||||
}
|
||||
|
||||
if err := digContainer.Invoke(func(useCases *UseCases) { Container = useCases }); err != nil {
|
||||
panic("Unable to invoke container: " + err.Error())
|
||||
}
|
||||
}
|
||||
|
||||
func provideRepositories(container *dig.Container) {
|
||||
repositories := []any{
|
||||
gateways.NewPostRepository,
|
||||
gateways.NewUserRepository,
|
||||
gateways.NewImageRepository,
|
||||
gateways.NewMailRepository,
|
||||
gateways.NewPageRepository,
|
||||
}
|
||||
|
||||
for _, repo := range repositories {
|
||||
if err := container.Provide(repo); err != nil {
|
||||
funcName := runtime.FuncForPC(reflect.ValueOf(repo).Pointer()).Name()
|
||||
panic(fmt.Sprintf("Failed to provide repository %s: %v", funcName, err))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user