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:
@@ -4,11 +4,12 @@ import (
|
|||||||
"GoCMS/domain/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"bytes"
|
"bytes"
|
||||||
"embed"
|
"embed"
|
||||||
"gopkg.in/gomail.v2"
|
|
||||||
"html/template"
|
"html/template"
|
||||||
"log"
|
"log"
|
||||||
"os"
|
"os"
|
||||||
"strconv"
|
"strconv"
|
||||||
|
|
||||||
|
"gopkg.in/gomail.v2"
|
||||||
)
|
)
|
||||||
|
|
||||||
type MailRepository struct{}
|
type MailRepository struct{}
|
||||||
@@ -16,7 +17,11 @@ type MailRepository struct{}
|
|||||||
//go:embed mail/templates/*
|
//go:embed mail/templates/*
|
||||||
var mailTemplateFiles embed.FS
|
var mailTemplateFiles embed.FS
|
||||||
|
|
||||||
func (m MailRepository) Send(receiverAddress string, templateName string, data interface{}) error {
|
func NewMailRepository() *MailRepository {
|
||||||
|
return &MailRepository{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m MailRepository) Send(receiverAddress string, templateName string, data any) error {
|
||||||
from := os.Getenv("SMTP_EMAIL")
|
from := os.Getenv("SMTP_EMAIL")
|
||||||
password := os.Getenv("SMTP_PASSWORD")
|
password := os.Getenv("SMTP_PASSWORD")
|
||||||
smtpHost := os.Getenv("SMTP_HOST")
|
smtpHost := os.Getenv("SMTP_HOST")
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func NewPageRepository() *PageRepository {
|
|||||||
return &PageRepository{}
|
return &PageRepository{}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p *PageRepository) Get(name string, data interface{}) ([]byte, error) {
|
func (p *PageRepository) Get(name string, data any) ([]byte, error) {
|
||||||
var processedHTML bytes.Buffer
|
var processedHTML bytes.Buffer
|
||||||
tmpl, err := template.ParseFS(webTemplateFiles, "web/templates/"+name+".html")
|
tmpl, err := template.ParseFS(webTemplateFiles, "web/templates/"+name+".html")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -7,7 +7,7 @@
|
|||||||
<body class="text-dark">
|
<body class="text-dark">
|
||||||
{{.Navbar}}
|
{{.Navbar}}
|
||||||
<div class="container mt-3 text-black-50">
|
<div class="container mt-3 text-black-50">
|
||||||
<h1>Accueil</h1>
|
<h1>Home</h1>
|
||||||
<p>Welcome on GoCMS !</p>
|
<p>Welcome on GoCMS !</p>
|
||||||
<a href="/post">
|
<a href="/post">
|
||||||
<button class="btn btn-outline-primary">Posts »</button>
|
<button class="btn btn-outline-primary">Posts »</button>
|
||||||
|
|||||||
@@ -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."
|
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 {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@@ -138,7 +138,7 @@ func login(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
_ = SetJwtCookie(&w, dbUser.ID)
|
_ = 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)
|
_, _ = w.Write(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -170,7 +170,7 @@ func register(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
_ = SetJwtCookie(&w, createdUser.ID)
|
_ = 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)
|
_, _ = w.Write(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -188,7 +188,7 @@ func RemoveJwtCookie(w http.ResponseWriter) {
|
|||||||
|
|
||||||
func logout(w http.ResponseWriter, _ *http.Request) {
|
func logout(w http.ResponseWriter, _ *http.Request) {
|
||||||
RemoveJwtCookie(w)
|
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)
|
_, _ = w.Write(message)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ func PostImage(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
newJson := map[string]interface{}{"location": newImage.Path}
|
newJson := map[string]any{"location": newImage.Path}
|
||||||
newJsonBytes, _ := json.Marshal(newJson)
|
newJsonBytes, _ := json.Marshal(newJson)
|
||||||
|
|
||||||
_, _ = w.Write(newJsonBytes)
|
_, _ = w.Write(newJsonBytes)
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import (
|
|||||||
|
|
||||||
func GetHomePage(w http.ResponseWriter, _ *http.Request) {
|
func GetHomePage(w http.ResponseWriter, _ *http.Request) {
|
||||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
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),
|
"Navbar": template.HTML(navbarTmpl),
|
||||||
"Head": headTmpl,
|
"Head": headTmpl,
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ import (
|
|||||||
|
|
||||||
func GetPageIntegration(w http.ResponseWriter, r *http.Request) {
|
func GetPageIntegration(w http.ResponseWriter, r *http.Request) {
|
||||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
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),
|
"Navbar": template.HTML(navbarTmpl),
|
||||||
"Head": headTmpl,
|
"Head": headTmpl,
|
||||||
"Host": os.Getenv("HOST"),
|
"Host": os.Getenv("HOST"),
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ func GetLoginPageHandler(loginPage *LoginPage) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
success, _ := url.QueryUnescape(r.URL.Query().Get("success"))
|
success, _ := url.QueryUnescape(r.URL.Query().Get("success"))
|
||||||
failure, _ := url.QueryUnescape(r.URL.Query().Get("failure"))
|
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,
|
"PageError": loginPage.PageError,
|
||||||
"Username": loginPage.Username,
|
"Username": loginPage.Username,
|
||||||
"Head": headTmpl,
|
"Head": headTmpl,
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ func GetPasswordResetRequest(w http.ResponseWriter, r *http.Request) {
|
|||||||
success := r.URL.Query().Get("success")
|
success := r.URL.Query().Get("success")
|
||||||
email := r.URL.Query().Get("email")
|
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,
|
"Head": headTmpl,
|
||||||
"Email": email,
|
"Email": email,
|
||||||
"Success": success,
|
"Success": success,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ func GetPasswordResetValidate(w http.ResponseWriter, r *http.Request) {
|
|||||||
if failure != "" {
|
if failure != "" {
|
||||||
pageError = NewPageError(failure)
|
pageError = NewPageError(failure)
|
||||||
}
|
}
|
||||||
template, _ := api.Container.GetPageUseCase.GetPage("passwordResetValidate", map[string]interface{}{
|
template, _ := api.Container.GetPageUseCase.GetPage("passwordResetValidate", map[string]any{
|
||||||
"Head": headTmpl,
|
"Head": headTmpl,
|
||||||
"Error": pageError,
|
"Error": pageError,
|
||||||
"Email": r.URL.Query().Get("email"),
|
"Email": r.URL.Query().Get("email"),
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ type PostCreatePageError struct {
|
|||||||
|
|
||||||
func GetPostCreatePageTemplate(postName string, errorMessage string) ([]byte, error) {
|
func GetPostCreatePageTemplate(postName string, errorMessage string) ([]byte, error) {
|
||||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
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),
|
"Navbar": template.HTML(navbarTmpl),
|
||||||
"Head": headTmpl,
|
"Head": headTmpl,
|
||||||
"PageError": PostCreatePageError{
|
"PageError": PostCreatePageError{
|
||||||
|
|||||||
@@ -18,7 +18,7 @@ type PostEditPageAlert struct {
|
|||||||
|
|
||||||
func getPostEditPageTemplate(post post.Post, alert PostEditPageAlert) []byte {
|
func getPostEditPageTemplate(post post.Post, alert PostEditPageAlert) []byte {
|
||||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
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),
|
"Navbar": template.HTML(navbarTmpl),
|
||||||
"Head": headTmpl,
|
"Head": headTmpl,
|
||||||
"Post": post,
|
"Post": post,
|
||||||
|
|||||||
@@ -9,9 +9,9 @@ import (
|
|||||||
func GetPostsPage(w http.ResponseWriter, _ *http.Request) {
|
func GetPostsPage(w http.ResponseWriter, _ *http.Request) {
|
||||||
posts := api.Container.ListPostsUseCase.ListPosts()
|
posts := api.Container.ListPostsUseCase.ListPosts()
|
||||||
|
|
||||||
var formattedPosts []map[string]interface{}
|
var formattedPosts []map[string]any
|
||||||
for _, post := range posts {
|
for _, post := range posts {
|
||||||
formattedPosts = append(formattedPosts, map[string]interface{}{
|
formattedPosts = append(formattedPosts, map[string]any{
|
||||||
"ID": post.ID,
|
"ID": post.ID,
|
||||||
"Title": post.Title,
|
"Title": post.Title,
|
||||||
"IsOnline": post.IsOnline,
|
"IsOnline": post.IsOnline,
|
||||||
@@ -21,7 +21,7 @@ func GetPostsPage(w http.ResponseWriter, _ *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
navbarTmpl, _ := api.Container.GetPageUseCase.GetPage("componentNavbar", nil)
|
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),
|
"Navbar": template.HTML(navbarTmpl),
|
||||||
"Head": headTmpl,
|
"Head": headTmpl,
|
||||||
"Posts": formattedPosts,
|
"Posts": formattedPosts,
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ func GetRegisterPageHandler(registerPage *RegisterPage) http.HandlerFunc {
|
|||||||
PostRegisterPage(w, r)
|
PostRegisterPage(w, r)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
bs, err := api.Container.GetPageUseCase.GetPage("register", map[string]interface{}{
|
bs, err := api.Container.GetPageUseCase.GetPage("register", map[string]any{
|
||||||
"PageError": registerPage.PageError,
|
"PageError": registerPage.PageError,
|
||||||
"Username": registerPage.Username,
|
"Username": registerPage.Username,
|
||||||
"Email": registerPage.Email,
|
"Email": registerPage.Email,
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ func PostRegisterPendingPage(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func GetRegisterPendingPage(w http.ResponseWriter, _ *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,
|
"Head": headTmpl,
|
||||||
})
|
})
|
||||||
_, _ = w.Write(registerPendingTmpl)
|
_, _ = 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,
|
"Head": headTmpl,
|
||||||
"PageError": NewPageError(errorMessage),
|
"PageError": NewPageError(errorMessage),
|
||||||
})
|
})
|
||||||
|
|||||||
+81
-23
@@ -1,15 +1,42 @@
|
|||||||
package api
|
package api
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"GoCMS/adapters/secondary/gateways"
|
||||||
"GoCMS/adapters/secondary/gateways/models"
|
"GoCMS/adapters/secondary/gateways/models"
|
||||||
"GoCMS/useCases"
|
"GoCMS/useCases"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"reflect"
|
||||||
|
"runtime"
|
||||||
|
|
||||||
"github.com/glebarez/sqlite"
|
"github.com/glebarez/sqlite"
|
||||||
"go.uber.org/dig"
|
"go.uber.org/dig"
|
||||||
"gorm.io/gorm"
|
"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 {
|
type UseCases struct {
|
||||||
CreatePostUseCase *useCases.CreatePostUseCase
|
CreatePostUseCase *useCases.CreatePostUseCase
|
||||||
GetPostUseCase *useCases.GetPostUseCase
|
GetPostUseCase *useCases.GetPostUseCase
|
||||||
@@ -45,29 +72,60 @@ func InitContainer() {
|
|||||||
digContainer := dig.New()
|
digContainer := dig.New()
|
||||||
|
|
||||||
database := getDb()
|
database := getDb()
|
||||||
_ = database.AutoMigrate(&models.Post{}, &models.User{})
|
if err := database.AutoMigrate(&models.Post{}, &models.User{}); err != nil {
|
||||||
_ = digContainer.Provide(func() *gorm.DB { return database })
|
panic("Failed to migrate database: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
_ = digContainer.Provide(func(db *gorm.DB) *UseCases {
|
if err := digContainer.Provide(func() *gorm.DB { return database }); err != nil {
|
||||||
return &UseCases{
|
panic("Failed to provide database: " + err.Error())
|
||||||
CreatePostUseCase: useCases.NewCreatePostUseCase(db),
|
}
|
||||||
GetPostUseCase: useCases.NewGetPostUseCase(db),
|
|
||||||
ListPostsUseCase: useCases.NewListPostsUseCase(db),
|
provideRepositories(digContainer)
|
||||||
UpdatePostUseCase: useCases.NewUpdatePostUseCase(db),
|
|
||||||
DeletePostUseCase: useCases.NewDeletePostUseCase(db),
|
for _, def := range useCaseDefinitions {
|
||||||
GetUserUseCase: useCases.NewGetUserUseCase(db),
|
if err := digContainer.Provide(def.Constructor); err != nil {
|
||||||
CreateUserUseCase: useCases.NewCreateUserUseCase(db),
|
funcName := runtime.FuncForPC(reflect.ValueOf(def.Constructor).Pointer()).Name()
|
||||||
UpdateUserUseCase: useCases.NewUpdateUserUseCase(db),
|
panic(fmt.Sprintf("Failed to provide %s: %v", funcName, err))
|
||||||
DeleteUserUseCase: useCases.NewDeleteUserUseCase(db),
|
|
||||||
ListUsersUseCase: useCases.NewListUsersUseCase(db),
|
|
||||||
GetPageUseCase: useCases.NewGetPageUseCase(),
|
|
||||||
SendMailUseCase: useCases.NewSendMailUseCase(),
|
|
||||||
CreateImageUseCase: useCases.NewCreateImageUseCase(db),
|
|
||||||
DeleteImageUseCase: useCases.NewDeleteImageUseCase(db),
|
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
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())
|
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))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
package gateways
|
package gateways
|
||||||
|
|
||||||
type IMailRepository interface {
|
type IMailRepository interface {
|
||||||
Send(receiverAddress string, templateName string, data interface{}) error
|
Send(receiverAddress string, templateName string, data any) error
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
package gateways
|
package gateways
|
||||||
|
|
||||||
type IPageRepository interface {
|
type IPageRepository interface {
|
||||||
Get(name string, data interface{}) ([]byte, error)
|
Get(name string, data any) ([]byte, error)
|
||||||
}
|
}
|
||||||
|
|||||||
+1
-1
@@ -46,7 +46,7 @@ func StartServerIfNotAlready() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func getAuthorizationCookie(userId uint32) *http.Cookie {
|
func getAuthorizationCookie(userId uint32) *http.Cookie {
|
||||||
_, tokenString, err := auth.Token.Encode(map[string]interface{}{"user_id": userId})
|
_, tokenString, err := auth.Token.Encode(map[string]any{"user_id": userId})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,20 +1,17 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"GoCMS/domain/image"
|
"GoCMS/domain/image"
|
||||||
"gorm.io/gorm"
|
|
||||||
"mime/multipart"
|
"mime/multipart"
|
||||||
)
|
)
|
||||||
|
|
||||||
type CreateImageUseCase struct {
|
type CreateImageUseCase struct {
|
||||||
imageRepository gateways.ImageRepository
|
imageRepository gateways.IImageRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCreateImageUseCase(db *gorm.DB) *CreateImageUseCase {
|
func NewCreateImageUseCase(imageRepository gateways.IImageRepository) *CreateImageUseCase {
|
||||||
return &CreateImageUseCase{
|
return &CreateImageUseCase{imageRepository}
|
||||||
imageRepository: *gateways.NewImageRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *CreateImageUseCase) CreateImage(file multipart.File, fileHeader multipart.FileHeader) (image.Image, error) {
|
func (g *CreateImageUseCase) CreateImage(file multipart.File, fileHeader multipart.FileHeader) (image.Image, error) {
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"GoCMS/domain/post"
|
"GoCMS/domain/post"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CreatePostUseCase struct {
|
type CreatePostUseCase struct {
|
||||||
postRepository gateways.PostRepository
|
postRepository gateways.IPostRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
type CreatePostCommand struct {
|
type CreatePostCommand struct {
|
||||||
@@ -15,10 +14,8 @@ type CreatePostCommand struct {
|
|||||||
Body string
|
Body string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCreatePostUseCase(db *gorm.DB) *CreatePostUseCase {
|
func NewCreatePostUseCase(postRepository gateways.IPostRepository) *CreatePostUseCase {
|
||||||
return &CreatePostUseCase{
|
return &CreatePostUseCase{postRepository}
|
||||||
postRepository: *gateways.NewPostRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *CreatePostUseCase) CreatePost(createPost CreatePostCommand) (post.Post, error) {
|
func (g *CreatePostUseCase) CreatePost(createPost CreatePostCommand) (post.Post, error) {
|
||||||
|
|||||||
@@ -1,13 +1,12 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"GoCMS/domain/user"
|
"GoCMS/domain/user"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type CreateUserUseCase struct {
|
type CreateUserUseCase struct {
|
||||||
userRepository gateways.UserRepository
|
userRepository gateways.IUserRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
type CreateUserCommand struct {
|
type CreateUserCommand struct {
|
||||||
@@ -17,10 +16,8 @@ type CreateUserCommand struct {
|
|||||||
VerificationCode string
|
VerificationCode string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewCreateUserUseCase(db *gorm.DB) *CreateUserUseCase {
|
func NewCreateUserUseCase(userRepository gateways.IUserRepository) *CreateUserUseCase {
|
||||||
return &CreateUserUseCase{
|
return &CreateUserUseCase{userRepository}
|
||||||
userRepository: *gateways.NewUserRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *CreateUserUseCase) CreateUser(createUser CreateUserCommand) (user.User, error) {
|
func (g *CreateUserUseCase) CreateUser(createUser CreateUserCommand) (user.User, error) {
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type DeleteImageUseCase struct {
|
type DeleteImageUseCase struct {
|
||||||
imageRepository gateways.ImageRepository
|
imageRepository gateways.IImageRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDeleteImageUseCase(db *gorm.DB) *DeleteImageUseCase {
|
func NewDeleteImageUseCase(imageRepository gateways.IImageRepository) *DeleteImageUseCase {
|
||||||
return &DeleteImageUseCase{
|
return &DeleteImageUseCase{imageRepository}
|
||||||
imageRepository: *gateways.NewImageRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *DeleteImageUseCase) DeleteImage(imageId uint32) error {
|
func (g *DeleteImageUseCase) DeleteImage(imageId uint32) error {
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type DeletePostUseCase struct {
|
type DeletePostUseCase struct {
|
||||||
postRepository gateways.PostRepository
|
postRepository gateways.IPostRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDeletePostUseCase(db *gorm.DB) *DeletePostUseCase {
|
func NewDeletePostUseCase(postRepository gateways.IPostRepository) *DeletePostUseCase {
|
||||||
return &DeletePostUseCase{
|
return &DeletePostUseCase{postRepository}
|
||||||
postRepository: *gateways.NewPostRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *DeletePostUseCase) DeletePost(userId uint32) error {
|
func (g *DeletePostUseCase) DeletePost(userId uint32) error {
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type DeleteUserUseCase struct {
|
type DeleteUserUseCase struct {
|
||||||
userRepository gateways.UserRepository
|
userRepository gateways.IUserRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewDeleteUserUseCase(db *gorm.DB) *DeleteUserUseCase {
|
func NewDeleteUserUseCase(userRepository gateways.IUserRepository) *DeleteUserUseCase {
|
||||||
return &DeleteUserUseCase{
|
return &DeleteUserUseCase{userRepository}
|
||||||
userRepository: *gateways.NewUserRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *DeleteUserUseCase) DeleteUser(userId uint32) error {
|
func (g *DeleteUserUseCase) DeleteUser(userId uint32) error {
|
||||||
|
|||||||
+5
-7
@@ -1,19 +1,17 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GetPageUseCase struct {
|
type GetPageUseCase struct {
|
||||||
pageRepository gateways.PageRepository
|
pageRepository gateways.IPageRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGetPageUseCase() *GetPageUseCase {
|
func NewGetPageUseCase(pageRepository gateways.IPageRepository) *GetPageUseCase {
|
||||||
return &GetPageUseCase{
|
return &GetPageUseCase{pageRepository}
|
||||||
pageRepository: *gateways.NewPageRepository(),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GetPageUseCase) GetPage(name string, data interface{}) ([]byte, error) {
|
func (g *GetPageUseCase) GetPage(name string, data any) ([]byte, error) {
|
||||||
return g.pageRepository.Get(name, data)
|
return g.pageRepository.Get(name, data)
|
||||||
}
|
}
|
||||||
|
|||||||
+4
-7
@@ -1,19 +1,16 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"GoCMS/domain/post"
|
"GoCMS/domain/post"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type GetPostUseCase struct {
|
type GetPostUseCase struct {
|
||||||
postRepository gateways.PostRepository
|
postRepository gateways.IPostRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGetPostUseCase(db *gorm.DB) *GetPostUseCase {
|
func NewGetPostUseCase(postRepository gateways.IPostRepository) *GetPostUseCase {
|
||||||
return &GetPostUseCase{
|
return &GetPostUseCase{postRepository}
|
||||||
postRepository: *gateways.NewPostRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GetPostUseCase) GetPost(id uint32) (post.Post, error) {
|
func (g *GetPostUseCase) GetPost(id uint32) (post.Post, error) {
|
||||||
|
|||||||
+4
-7
@@ -1,19 +1,16 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"GoCMS/domain/user"
|
"GoCMS/domain/user"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type GetUserUseCase struct {
|
type GetUserUseCase struct {
|
||||||
userRepository gateways.UserRepository
|
userRepository gateways.IUserRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGetUserUseCase(db *gorm.DB) *GetUserUseCase {
|
func NewGetUserUseCase(userRepository gateways.IUserRepository) *GetUserUseCase {
|
||||||
return &GetUserUseCase{
|
return &GetUserUseCase{userRepository}
|
||||||
userRepository: *gateways.NewUserRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *GetUserUseCase) GetUser(id uint32) (user.User, error) {
|
func (g *GetUserUseCase) GetUser(id uint32) (user.User, error) {
|
||||||
|
|||||||
@@ -1,19 +1,16 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"GoCMS/domain/post"
|
"GoCMS/domain/post"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ListPostsUseCase struct {
|
type ListPostsUseCase struct {
|
||||||
postRepository gateways.PostRepository
|
postRepository gateways.IPostRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewListPostsUseCase(db *gorm.DB) *ListPostsUseCase {
|
func NewListPostsUseCase(postRepository gateways.IPostRepository) *ListPostsUseCase {
|
||||||
return &ListPostsUseCase{
|
return &ListPostsUseCase{postRepository}
|
||||||
postRepository: *gateways.NewPostRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *ListPostsUseCase) ListPosts() []post.Post {
|
func (g *ListPostsUseCase) ListPosts() []post.Post {
|
||||||
|
|||||||
@@ -1,19 +1,16 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"GoCMS/domain/user"
|
"GoCMS/domain/user"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type ListUsersUseCase struct {
|
type ListUsersUseCase struct {
|
||||||
userRepository gateways.UserRepository
|
userRepository gateways.IUserRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewListUsersUseCase(db *gorm.DB) *ListUsersUseCase {
|
func NewListUsersUseCase(userRepository gateways.IUserRepository) *ListUsersUseCase {
|
||||||
return &ListUsersUseCase{
|
return &ListUsersUseCase{userRepository}
|
||||||
userRepository: *gateways.NewUserRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *ListUsersUseCase) ListUsers() []user.User {
|
func (g *ListUsersUseCase) ListUsers() []user.User {
|
||||||
|
|||||||
@@ -1,17 +1,17 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
)
|
)
|
||||||
|
|
||||||
type SendMailUseCase struct {
|
type SendMailUseCase struct {
|
||||||
mailRepository gateways.MailRepository
|
mailRepository gateways.IMailRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewSendMailUseCase() *SendMailUseCase {
|
func NewSendMailUseCase(mailRepository gateways.IMailRepository) *SendMailUseCase {
|
||||||
return &SendMailUseCase{}
|
return &SendMailUseCase{mailRepository}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *SendMailUseCase) SendMail(receiverAddress string, templateName string, data interface{}) error {
|
func (g *SendMailUseCase) SendMail(receiverAddress string, templateName string, data any) error {
|
||||||
return g.mailRepository.Send(receiverAddress, templateName, data)
|
return g.mailRepository.Send(receiverAddress, templateName, data)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,19 +1,16 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"GoCMS/domain/post"
|
"GoCMS/domain/post"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type UpdatePostUseCase struct {
|
type UpdatePostUseCase struct {
|
||||||
postRepository gateways.PostRepository
|
postRepository gateways.IPostRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUpdatePostUseCase(db *gorm.DB) *UpdatePostUseCase {
|
func NewUpdatePostUseCase(postRepository gateways.IPostRepository) *UpdatePostUseCase {
|
||||||
return &UpdatePostUseCase{
|
return &UpdatePostUseCase{postRepository}
|
||||||
postRepository: *gateways.NewPostRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *UpdatePostUseCase) UpdateBody(id uint32, body string) (post.Post, error) {
|
func (g *UpdatePostUseCase) UpdateBody(id uint32, body string) (post.Post, error) {
|
||||||
|
|||||||
@@ -1,19 +1,16 @@
|
|||||||
package useCases
|
package useCases
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"GoCMS/adapters/secondary/gateways"
|
"GoCMS/domain/gateways"
|
||||||
"GoCMS/domain/user"
|
"GoCMS/domain/user"
|
||||||
"gorm.io/gorm"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
type UpdateUserUseCase struct {
|
type UpdateUserUseCase struct {
|
||||||
userRepository gateways.UserRepository
|
userRepository gateways.IUserRepository
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewUpdateUserUseCase(db *gorm.DB) *UpdateUserUseCase {
|
func NewUpdateUserUseCase(userRepository gateways.IUserRepository) *UpdateUserUseCase {
|
||||||
return &UpdateUserUseCase{
|
return &UpdateUserUseCase{userRepository}
|
||||||
userRepository: *gateways.NewUserRepository(db),
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (g *UpdateUserUseCase) UpdateVerificationStatus(userId uint32, isVerified bool) (user.User, error) {
|
func (g *UpdateUserUseCase) UpdateVerificationStatus(userId uint32, isVerified bool) (user.User, error) {
|
||||||
|
|||||||
Reference in New Issue
Block a user