feat: delete news, tag, and category
This commit is contained in:
parent
299fcf949b
commit
d217ec8a62
@ -11,4 +11,6 @@ type Category struct {
|
|||||||
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
|
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
|
||||||
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
|
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
|
||||||
DeletedAt time.Time `gorm:"default:null" json:"deleted_at"`
|
DeletedAt time.Time `gorm:"default:null" json:"deleted_at"`
|
||||||
|
|
||||||
|
News []News `gorm:"many2many:news_categories" json:"news"`
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,4 +11,6 @@ type Tag struct {
|
|||||||
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
|
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
|
||||||
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
|
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
|
||||||
DeletedAt time.Time `gorm:"default:null" json:"deleted_at"`
|
DeletedAt time.Time `gorm:"default:null" json:"deleted_at"`
|
||||||
|
|
||||||
|
News []News `gorm:"many2many:news_tags" json:"news"`
|
||||||
}
|
}
|
||||||
@ -14,7 +14,7 @@ func (a *accessor) CreateModel(spec categorydomain.CategoryReq) error {
|
|||||||
Code: spec.Code,
|
Code: spec.Code,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := a.DB.Create(&data).Error; err != nil {
|
if err := a.db.Create(&data).Error; err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,11 +2,21 @@ package categoryrepository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
categorydomain "legalgo-BE-go/internal/domain/category"
|
"legalgo-BE-go/database"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (a *accessor) Delete(id string) error {
|
func (a *accessor) Delete(id string) error {
|
||||||
if err := a.DB.Delete(&categorydomain.Category{}, "id = ?", id).Error; err != nil {
|
var category database.Category
|
||||||
|
|
||||||
|
if err := a.db.First(&category, "id = ?", id).Error; err != nil {
|
||||||
|
return fmt.Errorf("failed to find category: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := a.db.Model(&category).Association("News").Clear(); err != nil {
|
||||||
|
return fmt.Errorf("failed to remove categories association: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := a.db.Delete(&category).Error; err != nil {
|
||||||
return fmt.Errorf("failed to delete category %s : %v", id, err)
|
return fmt.Errorf("failed to delete category %s : %v", id, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import (
|
|||||||
func (a *accessor) GetAllModel() ([]categorydomain.Category, error) {
|
func (a *accessor) GetAllModel() ([]categorydomain.Category, error) {
|
||||||
var categories []categorydomain.Category
|
var categories []categorydomain.Category
|
||||||
|
|
||||||
if err := a.DB.Find(&categories).Error; err != nil {
|
if err := a.db.Find(&categories).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import (
|
|||||||
func (a *accessor) GetByIDs(ids []string) ([]categorydomain.Category, error) {
|
func (a *accessor) GetByIDs(ids []string) ([]categorydomain.Category, error) {
|
||||||
var categories []categorydomain.Category
|
var categories []categorydomain.Category
|
||||||
|
|
||||||
if err := a.DB.Find(&categories, "id IN ?", ids).Error; err != nil {
|
if err := a.db.Find(&categories, "id IN ?", ids).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type accessor struct {
|
type accessor struct {
|
||||||
DB *database.DB
|
db *database.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
type Category interface {
|
type Category interface {
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (a *accessor) Update(spec categorydomain.Category) error {
|
func (a *accessor) Update(spec categorydomain.Category) error {
|
||||||
if err := a.DB.Clauses(clause.OnConflict{
|
if err := a.db.Clauses(clause.OnConflict{
|
||||||
Columns: []clause.Column{{Name: "id"}},
|
Columns: []clause.Column{{Name: "id"}},
|
||||||
DoUpdates: clause.AssignmentColumns([]string{"name", "code", "updated_at"}),
|
DoUpdates: clause.AssignmentColumns([]string{"name", "code", "updated_at"}),
|
||||||
}).Select("name", "code", "updated_at").Save(&spec).Error; err != nil {
|
}).Select("name", "code", "updated_at").Save(&spec).Error; err != nil {
|
||||||
|
|||||||
28
internal/accessor/news/delete.go
Normal file
28
internal/accessor/news/delete.go
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
package newsrepository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
newsdomain "legalgo-BE-go/internal/domain/news"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (a *accessor) Delete(id string) error {
|
||||||
|
var news newsdomain.News
|
||||||
|
|
||||||
|
if err := a.db.Preload("Categories").Preload("Tags").First(&news, "id = ?", id).Error; err != nil {
|
||||||
|
return fmt.Errorf("failed to find news: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := a.db.Model(&news).Association("Categories").Clear(); err != nil {
|
||||||
|
return fmt.Errorf("failed to remove categories association: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := a.db.Model(&news).Association("Tags").Clear(); err != nil {
|
||||||
|
return fmt.Errorf("failed to remove tags association: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := a.db.Delete(&news, "id = ?", id).Error; err != nil {
|
||||||
|
return fmt.Errorf("failed to delete news %s : %v", id, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
||||||
@ -12,6 +12,7 @@ type accessor struct {
|
|||||||
type News interface {
|
type News interface {
|
||||||
GetAll() ([]newsdomain.News, error)
|
GetAll() ([]newsdomain.News, error)
|
||||||
Create(newsdomain.News) error
|
Create(newsdomain.News) error
|
||||||
|
Delete(string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(db *database.DB) News {
|
func New(db *database.DB) News {
|
||||||
|
|||||||
@ -13,7 +13,7 @@ func (acc *accessor) Create(spec tagdomain.TagReq) error {
|
|||||||
Name: spec.Name,
|
Name: spec.Name,
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := acc.DB.Create(&data).Error; err != nil {
|
if err := acc.db.Create(&data).Error; err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -2,12 +2,22 @@ package tagrepository
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
tagdomain "legalgo-BE-go/internal/domain/tag"
|
"legalgo-BE-go/database"
|
||||||
)
|
)
|
||||||
|
|
||||||
func (a *accessor) Delete(id string) error {
|
func (a *accessor) Delete(id string) error {
|
||||||
if err := a.DB.Delete(&tagdomain.Tag{}, "id = ?", id).Error; err != nil {
|
var tag database.Tag
|
||||||
return fmt.Errorf("failed to delete category %s : %v", id, err)
|
|
||||||
|
if err := a.db.First(&tag, "id = ?", id).Error; err != nil {
|
||||||
|
return fmt.Errorf("failed to find tag: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := a.db.Model(&tag).Association("News").Clear(); err != nil {
|
||||||
|
return fmt.Errorf("failed to remove tag association: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := a.db.Delete(&tag).Error; err != nil {
|
||||||
|
return fmt.Errorf("failed to delete tag %s : %v", id, err)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import (
|
|||||||
func (acc *accessor) GetAll() ([]tagdomain.Tag, error) {
|
func (acc *accessor) GetAll() ([]tagdomain.Tag, error) {
|
||||||
var tags []tagdomain.Tag
|
var tags []tagdomain.Tag
|
||||||
|
|
||||||
if err := acc.DB.Find(&tags).Error; err != nil {
|
if err := acc.db.Find(&tags).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import tagdomain "legalgo-BE-go/internal/domain/tag"
|
|||||||
func (a *accessor) GetByIDs(ids []string) ([]tagdomain.Tag, error) {
|
func (a *accessor) GetByIDs(ids []string) ([]tagdomain.Tag, error) {
|
||||||
var tags []tagdomain.Tag
|
var tags []tagdomain.Tag
|
||||||
|
|
||||||
if err := a.DB.Find(&tags, "id IN ?", ids).Error; err != nil {
|
if err := a.db.Find(&tags, "id IN ?", ids).Error; err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type accessor struct {
|
type accessor struct {
|
||||||
DB *database.DB
|
db *database.DB
|
||||||
}
|
}
|
||||||
|
|
||||||
type TagAccessor interface {
|
type TagAccessor interface {
|
||||||
|
|||||||
@ -8,7 +8,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func (a *accessor) Update(spec tagdomain.Tag) error {
|
func (a *accessor) Update(spec tagdomain.Tag) error {
|
||||||
if err := a.DB.Clauses(clause.OnConflict{
|
if err := a.db.Clauses(clause.OnConflict{
|
||||||
Columns: []clause.Column{{Name: "id"}},
|
Columns: []clause.Column{{Name: "id"}},
|
||||||
DoUpdates: clause.AssignmentColumns([]string{
|
DoUpdates: clause.AssignmentColumns([]string{
|
||||||
"name",
|
"name",
|
||||||
|
|||||||
53
internal/api/http/news/delete.go
Normal file
53
internal/api/http/news/delete.go
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
package newshttp
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
|
||||||
|
newssvc "legalgo-BE-go/internal/services/news"
|
||||||
|
"legalgo-BE-go/internal/utilities/response"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/go-chi/chi/v5"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Delete(
|
||||||
|
router chi.Router,
|
||||||
|
newsSvc newssvc.News,
|
||||||
|
) {
|
||||||
|
router.
|
||||||
|
With(authmiddleware.Authorize()).
|
||||||
|
Delete("/news/{news_id}/delete", func(w http.ResponseWriter, r *http.Request) {
|
||||||
|
ctx := r.Context()
|
||||||
|
newsID := chi.URLParam(r, "news_id")
|
||||||
|
|
||||||
|
if newsID == "" {
|
||||||
|
response.RespondJsonErrorWithCode(
|
||||||
|
ctx,
|
||||||
|
w,
|
||||||
|
fmt.Errorf("category id is not provided"),
|
||||||
|
response.ErrBadRequest.Code,
|
||||||
|
response.ErrBadRequest.HttpCode,
|
||||||
|
"news id is not provided",
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if err := newsSvc.Delete(newsID); err != nil {
|
||||||
|
response.RespondJsonErrorWithCode(
|
||||||
|
ctx,
|
||||||
|
w,
|
||||||
|
err,
|
||||||
|
response.ErrBadRequest.Code,
|
||||||
|
response.ErrBadRequest.HttpCode,
|
||||||
|
err.Error(),
|
||||||
|
)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
response.RespondJsonSuccess(ctx, w, struct {
|
||||||
|
Message string
|
||||||
|
}{
|
||||||
|
Message: "news has been deleted",
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
@ -5,4 +5,5 @@ import "go.uber.org/fx"
|
|||||||
var Module = fx.Module("news", fx.Invoke(
|
var Module = fx.Module("news", fx.Invoke(
|
||||||
GetAll,
|
GetAll,
|
||||||
Create,
|
Create,
|
||||||
|
Delete,
|
||||||
))
|
))
|
||||||
|
|||||||
@ -1,6 +1,8 @@
|
|||||||
package categorydomain
|
package categorydomain
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type Category struct {
|
type Category struct {
|
||||||
ID string `json:"id" gorm:"primaryKey"`
|
ID string `json:"id" gorm:"primaryKey"`
|
||||||
|
|||||||
5
internal/services/news/delete.go
Normal file
5
internal/services/news/delete.go
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package newssvc
|
||||||
|
|
||||||
|
func (i *impl) Delete(id string) error {
|
||||||
|
return i.newsRepo.Delete(id)
|
||||||
|
}
|
||||||
@ -16,6 +16,7 @@ type impl struct {
|
|||||||
type News interface {
|
type News interface {
|
||||||
GetAll() ([]newsdomain.News, error)
|
GetAll() ([]newsdomain.News, error)
|
||||||
Create(newsdomain.NewsReq, string) error
|
Create(newsdomain.NewsReq, string) error
|
||||||
|
Delete(string) error
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(
|
func New(
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user