diff --git a/README.md b/README.md index dc46fe3..f1f3a36 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ of course required, but not necessarily via the `.env` file. | Name | Type | Description | Comment | |----------------------|--------|:----------------------------------------------|-----------------------------------------------------------------------------------------------------------------------| | ENVIRONMENT | string | environment the API is running in | required, `development` or `production` | -| HOST | string | the host domain name for emails and callbacks | required | +| HOST | string | the host domain name for emails and callbacks | required, if `localhost`: add the port (e.g. `localhost:8080`) | | PORT | int | port the API will use | required | | JWT_SECRET | string | secret for the jwt auth | required | | CORS_ALLOWED_ORIGINS | string | allowed origins for CORS | required, semicolon separated list | diff --git a/adapters/secondary/gateways/articleRepository.go b/adapters/secondary/gateways/articleRepository.go new file mode 100644 index 0000000..f219b1e --- /dev/null +++ b/adapters/secondary/gateways/articleRepository.go @@ -0,0 +1,140 @@ +package gateways + +import ( + entity "GoCMS/adapters/secondary/gateways/models" + domain "GoCMS/domain/article" + "GoCMS/domain/gateways" + + "gorm.io/gorm" +) + +type ArticleRepository struct { + db *gorm.DB +} + +func NewArticleRepository(db *gorm.DB) *ArticleRepository { + return &ArticleRepository{db} +} + +func mapArticleToDomain(article entity.Article) domain.Article { + return domain.FromDb(article.ID, article.Title, article.Body, article.Images, article.IsOnline, article.CreatedAt, article.UpdatedAt) +} + +func (a *ArticleRepository) Get(id uint32) (domain.Article, error) { + var article entity.Article + err := a.db.Model(&entity.Article{}).Preload("Images").First(&article, id).Error + if err != nil { + return domain.Article{}, err + } + + return mapArticleToDomain(article), nil +} + +func (a *ArticleRepository) GetByName(name string) (domain.Article, error) { + var article entity.Article + err := a.db.Model(&entity.Article{}).Where("title = ?", name).First(&article).Error + if err != nil { + return domain.Article{}, err + } + + return mapArticleToDomain(article), nil +} + +func (a *ArticleRepository) Create(article domain.Article) (domain.Article, error) { + creationResult := a.db.Create(&entity.Article{ + Title: article.Title, + Body: article.Body, + }) + if creationResult.Error != nil { + return domain.Article{}, creationResult.Error + } + + var createdArticle entity.Article + creationResult.Scan(&createdArticle) + + return mapArticleToDomain(createdArticle), nil +} + +func (a *ArticleRepository) GetAll() []domain.Article { + var articles []entity.Article + err := a.db.Model(&entity.Article{}).Find(&articles).Error + if err != nil { + return []domain.Article{} + } + + var domainArticles = make([]domain.Article, 0) + for _, article := range articles { + domainArticles = append(domainArticles, mapArticleToDomain(article)) + } + + return domainArticles +} + +func (a *ArticleRepository) UpdateBody(id uint32, body string) (domain.Article, error) { + var localArticle entity.Article + err := a.db.Model(&entity.Article{}).First(&localArticle, id).Error + if err != nil { + return domain.Article{}, err + } + + localArticle.Body = body + err = a.db.Save(&localArticle).Error + if err != nil { + return domain.Article{}, err + } + + newArticle := domain.FromDb( + localArticle.ID, + localArticle.Title, + localArticle.Body, + localArticle.Images, + localArticle.IsOnline, + localArticle.CreatedAt, + localArticle.UpdatedAt, + ) + + return newArticle, nil +} + +func (a *ArticleRepository) UpdateIsOnline(id uint32, isOnline bool) (domain.Article, error) { + var localArticle entity.Article + err := a.db.Model(&entity.Article{}).First(&localArticle, id).Error + if err != nil { + return domain.Article{}, err + } + + localArticle.IsOnline = isOnline + err = a.db.Save(&localArticle).Error + if err != nil { + return domain.Article{}, err + } + + return mapArticleToDomain(localArticle), nil +} + +func (a *ArticleRepository) Delete(id uint32) error { + return a.db.Delete(&entity.Article{}, id).Error +} + +func (a *ArticleRepository) AddImage(articleId uint32, imageId uint32) error { + var localArticle entity.Article + err := a.db.Model(&entity.Article{}).First(&localArticle, articleId).Error + if err != nil { + return err + } + + var localImage entity.Image + err = a.db.Model(&entity.Image{}).First(&localImage, imageId).Error + if err != nil { + return err + } + + err = a.db.Model(&localArticle).Association("Images").Append(&localImage) + if err != nil { + return err + } + + return nil +} + +var _ gateways.IArticleRepository = &ArticleRepository{} diff --git a/adapters/secondary/gateways/imageRepository.go b/adapters/secondary/gateways/imageRepository.go index be625ce..ee3f9b7 100644 --- a/adapters/secondary/gateways/imageRepository.go +++ b/adapters/secondary/gateways/imageRepository.go @@ -30,7 +30,7 @@ func mapImageToDomain(image entity.Image) domain.Image { return domain.FromDB( image.ID, image.Path, - image.PostID, + image.ArticleID, image.CreatedAt, image.UpdatedAt, ) diff --git a/adapters/secondary/gateways/models/post.go b/adapters/secondary/gateways/models/article.go similarity index 79% rename from adapters/secondary/gateways/models/post.go rename to adapters/secondary/gateways/models/article.go index bae835c..5388146 100644 --- a/adapters/secondary/gateways/models/post.go +++ b/adapters/secondary/gateways/models/article.go @@ -1,16 +1,17 @@ package models import ( - "gorm.io/gorm" "time" + + "gorm.io/gorm" ) -type Post struct { +type Article struct { gorm.Model ID uint32 `gorm:"primary_key;auto_increment;not_null"` Title string Body string - Images []*Image `gorm:"many2many:post_images;"` + Images []*Image `gorm:"many2many:article_images;"` IsOnline bool `gorm:"not_null;default:false"` CreatedAt time.Time `gorm:"autoCreateTime"` UpdatedAt time.Time `gorm:"autoUpdateTime"` diff --git a/adapters/secondary/gateways/models/image.go b/adapters/secondary/gateways/models/image.go index 6430f07..3e6d0f2 100644 --- a/adapters/secondary/gateways/models/image.go +++ b/adapters/secondary/gateways/models/image.go @@ -1,15 +1,16 @@ package models import ( - "gorm.io/gorm" "time" + + "gorm.io/gorm" ) type Image struct { gorm.Model ID uint32 `gorm:"primary_key;auto_increment;not_null"` Path string - PostID uint32 + ArticleID uint32 CreatedAt time.Time `gorm:"autoCreateTime"` UpdatedAt time.Time `gorm:"autoUpdateTime"` } diff --git a/adapters/secondary/gateways/postRepository.go b/adapters/secondary/gateways/postRepository.go deleted file mode 100644 index 140af3b..0000000 --- a/adapters/secondary/gateways/postRepository.go +++ /dev/null @@ -1,139 +0,0 @@ -package gateways - -import ( - entity "GoCMS/adapters/secondary/gateways/models" - "GoCMS/domain/gateways" - domain "GoCMS/domain/post" - "gorm.io/gorm" -) - -type PostRepository struct { - db *gorm.DB -} - -func NewPostRepository(db *gorm.DB) *PostRepository { - return &PostRepository{db} -} - -func mapPostToDomain(post entity.Post) domain.Post { - return domain.FromDb(post.ID, post.Title, post.Body, post.Images, post.IsOnline, post.CreatedAt, post.UpdatedAt) -} - -func (a *PostRepository) Get(id uint32) (domain.Post, error) { - var post entity.Post - err := a.db.Model(&entity.Post{}).Preload("Images").First(&post, id).Error - if err != nil { - return domain.Post{}, err - } - - return mapPostToDomain(post), nil -} - -func (a *PostRepository) GetByName(name string) (domain.Post, error) { - var post entity.Post - err := a.db.Model(&entity.Post{}).Where("title = ?", name).First(&post).Error - if err != nil { - return domain.Post{}, err - } - - return mapPostToDomain(post), nil -} - -func (a *PostRepository) Create(post domain.Post) (domain.Post, error) { - creationResult := a.db.Create(&entity.Post{ - Title: post.Title, - Body: post.Body, - }) - if creationResult.Error != nil { - return domain.Post{}, creationResult.Error - } - - var createdPost entity.Post - creationResult.Scan(&createdPost) - - return mapPostToDomain(createdPost), nil -} - -func (a *PostRepository) GetAll() []domain.Post { - var posts []entity.Post - err := a.db.Model(&entity.Post{}).Find(&posts).Error - if err != nil { - return []domain.Post{} - } - - var domainPosts = make([]domain.Post, 0) - for _, post := range posts { - domainPosts = append(domainPosts, mapPostToDomain(post)) - } - - return domainPosts -} - -func (a *PostRepository) UpdateBody(id uint32, body string) (domain.Post, error) { - var localPost entity.Post - err := a.db.Model(&entity.Post{}).First(&localPost, id).Error - if err != nil { - return domain.Post{}, err - } - - localPost.Body = body - err = a.db.Save(&localPost).Error - if err != nil { - return domain.Post{}, err - } - - newPost := domain.FromDb( - localPost.ID, - localPost.Title, - localPost.Body, - localPost.Images, - localPost.IsOnline, - localPost.CreatedAt, - localPost.UpdatedAt, - ) - - return newPost, nil -} - -func (a *PostRepository) UpdateIsOnline(id uint32, isOnline bool) (domain.Post, error) { - var localPost entity.Post - err := a.db.Model(&entity.Post{}).First(&localPost, id).Error - if err != nil { - return domain.Post{}, err - } - - localPost.IsOnline = isOnline - err = a.db.Save(&localPost).Error - if err != nil { - return domain.Post{}, err - } - - return mapPostToDomain(localPost), nil -} - -func (a *PostRepository) Delete(id uint32) error { - return a.db.Delete(&entity.Post{}, id).Error -} - -func (a *PostRepository) AddImage(postId uint32, imageId uint32) error { - var localPost entity.Post - err := a.db.Model(&entity.Post{}).First(&localPost, postId).Error - if err != nil { - return err - } - - var localImage entity.Image - err = a.db.Model(&entity.Image{}).First(&localImage, imageId).Error - if err != nil { - return err - } - - err = a.db.Model(&localPost).Association("Images").Append(&localImage) - if err != nil { - return err - } - - return nil -} - -var _ gateways.IPostRepository = &PostRepository{} diff --git a/adapters/secondary/gateways/web/templates/postCreate.html b/adapters/secondary/gateways/web/templates/articleCreate.html similarity index 57% rename from adapters/secondary/gateways/web/templates/postCreate.html rename to adapters/secondary/gateways/web/templates/articleCreate.html index 6e35512..39ba457 100644 --- a/adapters/secondary/gateways/web/templates/postCreate.html +++ b/adapters/secondary/gateways/web/templates/articleCreate.html @@ -1,7 +1,7 @@ - GoCMS | Create post + GoCMS | Create article {{.Head}}