@@ -15,23 +15,22 @@ type repository struct {
1515
1616// GetDetailBlogPost implements domain.BlogPostRepository.
1717func (r * repository ) GetDetailBlogPost (ctx context.Context , slug , typeFind string , id uint ) (data domain.BlogPost , err error ) {
18- db := r .db .DB (ctx ).Preload ("Author" ).Model (& domain.BlogPost {})
18+ db := r .db .DB (ctx ).Preload ("Author" ).Model (& domain.BlogPost {}). Where ( "is_deleted = ?" , false )
1919
20- if typeFind == "slug" {
21- err = db . First ( & data , "slug = ?" , slug ).
22- Error
20+ switch typeFind {
21+ case "slug" :
22+ err = db . First ( & data , "slug = ?" , slug ). Error
2323 if err != nil {
2424 logrus .Error ("failed to get blog post detail: " , err )
2525 return data , err
2626 }
27- } else if typeFind == "id" {
28- err = db .First (& data , "id = ?" , id ).
29- Error
27+ case "id" :
28+ err = db .First (& data , "id = ?" , id ).Error
3029 if err != nil {
3130 logrus .Error ("failed to get blog post detail: " , err )
3231 return data , err
3332 }
34- } else {
33+ default :
3534 return domain.BlogPost {}, errors .New ("invalid typeFind parameter, must be 'slug' or 'id'" )
3635 }
3736
@@ -106,12 +105,9 @@ func (r *repository) UpdateBlogPost(ctx context.Context, data domain.BlogPost, i
106105}
107106
108107// CreateBlogPost implements domain.BlogPostRepository.
109- func (r * repository ) CreateBlogPost (ctx context.Context , data domain.BlogPost ) (domain.BlogPost , error ) {
110- var result domain.BlogPost
111- var err error
112-
108+ func (r * repository ) CreateBlogPost (ctx context.Context , data domain.BlogPost ) error {
113109 // Menggunakan StartTransaction yang sudah ada
114- err = r .db .StartTransaction (ctx , func (txCtx context.Context ) error {
110+ err : = r .db .StartTransaction (ctx , func (txCtx context.Context ) error {
115111 // 1. Periksa/Buat Author jika belum ada
116112 var authorExists int64
117113 if err := r .db .DB (txCtx ).Model (& domain.Author {}).
@@ -130,18 +126,16 @@ func (r *repository) CreateBlogPost(ctx context.Context, data domain.BlogPost) (
130126 }
131127 }
132128
129+ data .UpdatedAt = nil
133130 // Set AuthorID untuk relasi
134131 data .AuthorID = data .Author .UserId
135132
136133 // 2. Insert Blog Post
137- if err := r .db .DB (txCtx ).Create (& data ).Error ; err != nil {
134+ if err := r .db .DB (txCtx ).Omit ( "updated_at" ). Create (& data ).Error ; err != nil {
138135 logrus .Error ("failed to create blog post: " , err )
139136 return err
140137 }
141138
142- // Update result dengan data yang sudah memiliki ID
143- result = data
144-
145139 // 3. Insert Tags jika ada
146140 if len (data .Tags ) > 0 {
147141 for _ , tag := range data .Tags {
@@ -164,34 +158,61 @@ func (r *repository) CreateBlogPost(ctx context.Context, data domain.BlogPost) (
164158 })
165159
166160 if err != nil {
167- return domain. BlogPost {}, err
161+ return err
168162 }
169163
170- return result , nil
164+ return nil
171165}
172166
173167// DeleteBlogPost implements domain.BlogPostRepository.
174168func (r * repository ) DeleteBlogPost (ctx context.Context , id uint ) error {
175169 db := r .db .DB (ctx ).Model (& domain.BlogPost {})
176- err := db .Delete (& domain.BlogPost {}, "id = ?" , id ).Error
177- if err != nil {
178- logrus .Error ("failed to delete blog post: " , err )
179- return err
170+
171+ // Perform soft delete by updating is_deleted field
172+ result := db .Where ("id = ?" , id ).Updates (map [string ]interface {}{
173+ "is_deleted" : true ,
174+ })
175+
176+ if result .Error != nil {
177+ logrus .Error ("failed to soft delete blog post: " , result .Error )
178+ return result .Error
179+ }
180+
181+ if result .RowsAffected == 0 {
182+ logrus .Warn ("no blog post found to delete with id: " , id )
183+ return errors .New ("blog post not found" )
180184 }
181185 return nil
182186}
183187
184188// GetAllBlogPosts implements domain.BlogPostRepository.
185- func (r * repository ) GetAllBlogPosts (ctx context.Context ) (data []domain.BlogPost , err error ) {
186- // Mengambil data blog posts dengan author dalam satu query
187- err = r .db .DB (ctx ).
188- Preload ("Author" ).Find (& data ).Error
189+ func (r * repository ) GetAllBlogPosts (ctx context.Context , pagination domain.FilterPagination ) ([]domain.BlogPost , int , error ) {
190+ var data []domain.BlogPost
191+ var totalCount int64
192+
193+ if err := r .db .DB (ctx ).Model (& domain.BlogPost {}).Where ("is_deleted = ?" , false ).Count (& totalCount ).Error ; err != nil {
194+ logrus .Error ("failed to count blog posts: " , err )
195+ return nil , 0 , err
196+ }
197+
198+ offset := pagination .GetOffset ()
199+ limit := pagination .GetLimit ()
200+ orderBy := pagination .GetOrderBy ()
201+
202+ query := r .db .DB (ctx ).Preload ("Author" ).Where ("is_deleted = ?" , false )
203+
204+ if orderBy != "" {
205+ query = query .Order (orderBy )
206+ } else {
207+ query = query .Order ("id DESC" )
208+ }
209+
210+ err := query .Limit (limit ).Offset (offset ).Find (& data ).Error
189211 if err != nil {
190212 logrus .Error ("failed to get all blog posts: " , err )
191- return nil , err
213+ return nil , 0 , err
192214 }
193215
194- // Mengambil tags untuk setiap blog post
195216 for i := range data {
196217 var tags []string
197218 if err := r .db .DB (ctx ).Table ("blog_post_tags" ).
@@ -204,7 +225,7 @@ func (r *repository) GetAllBlogPosts(ctx context.Context) (data []domain.BlogPos
204225 }
205226 }
206227
207- return data , nil
228+ return data , int ( totalCount ), nil
208229}
209230
210231func NewRepository (db pkgDB.DatabaseTransaction ) domain.BlogPostRepository {
0 commit comments