86 lines
3.0 KiB
Go
86 lines
3.0 KiB
Go
package repository
|
|
|
|
import (
|
|
"narasi-ahli-be/app/database"
|
|
"narasi-ahli-be/app/database/entity"
|
|
"narasi-ahli-be/app/module/research_journals/request"
|
|
"narasi-ahli-be/utils/paginator"
|
|
)
|
|
|
|
type researchJournalsRepository struct {
|
|
DB *database.Database
|
|
}
|
|
|
|
type ResearchJournalsRepository interface {
|
|
GetAll(userId uint, req request.ResearchJournalsQueryRequest) (researchJournals []*entity.ResearchJournals, paging paginator.Pagination, err error)
|
|
FindOneByUserAndId(userId uint, id uint) (researchJournal *entity.ResearchJournals, err error)
|
|
Create(researchJournal *entity.ResearchJournals) (result *entity.ResearchJournals, err error)
|
|
Update(userId uint, id uint, researchJournal *entity.ResearchJournals) (err error)
|
|
Delete(userId uint, id uint) (err error)
|
|
}
|
|
|
|
func NewResearchJournalsRepository(db *database.Database) ResearchJournalsRepository {
|
|
return &researchJournalsRepository{
|
|
DB: db,
|
|
}
|
|
}
|
|
|
|
func (_i *researchJournalsRepository) GetAll(userId uint, req request.ResearchJournalsQueryRequest) (researchJournals []*entity.ResearchJournals, paging paginator.Pagination, err error) {
|
|
query := _i.DB.DB.
|
|
Model(&entity.ResearchJournals{}).
|
|
Where("user_id = ?", userId)
|
|
// Apply filters
|
|
if req.JournalTitle != nil {
|
|
query = query.Where("journal_title ILIKE ?", "%"+*req.JournalTitle+"%")
|
|
}
|
|
if req.Publisher != nil {
|
|
query = query.Where("publisher ILIKE ?", "%"+*req.Publisher+"%")
|
|
}
|
|
if req.PublishedYear != nil {
|
|
query = query.Where("EXTRACT(YEAR FROM published_date) = ?", *req.PublishedYear)
|
|
}
|
|
|
|
// Include user relationship
|
|
query = query.Preload("User")
|
|
|
|
// Order by published date desc (most recent first), then by created_at desc
|
|
query = query.Order("published_date DESC NULLS LAST, created_at DESC")
|
|
|
|
// Apply pagination
|
|
var count int64
|
|
query.Count(&count)
|
|
req.Pagination.Count = count
|
|
req.Pagination = paginator.Paging(req.Pagination)
|
|
|
|
err = query.Offset(req.Pagination.Offset).Limit(req.Pagination.Limit).Find(&researchJournals).Error
|
|
paging = *req.Pagination
|
|
|
|
return
|
|
}
|
|
|
|
func (_i *researchJournalsRepository) FindOneByUserAndId(userId uint, id uint) (researchJournal *entity.ResearchJournals, err error) {
|
|
err = _i.DB.DB.Where("user_id = ? AND id = ?", userId, id).Preload("User").First(&researchJournal).Error
|
|
return
|
|
}
|
|
|
|
func (_i *researchJournalsRepository) Create(researchJournal *entity.ResearchJournals) (result *entity.ResearchJournals, err error) {
|
|
err = _i.DB.DB.Create(researchJournal).Error
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Reload with relationships
|
|
err = _i.DB.DB.Preload("User").First(&result, researchJournal.ID).Error
|
|
return
|
|
}
|
|
|
|
func (_i *researchJournalsRepository) Update(userId uint, id uint, researchJournal *entity.ResearchJournals) (err error) {
|
|
err = _i.DB.DB.Where("user_id = ? AND id = ?", userId, id).Updates(researchJournal).Error
|
|
return
|
|
}
|
|
|
|
func (_i *researchJournalsRepository) Delete(userId uint, id uint) (err error) {
|
|
err = _i.DB.DB.Where("user_id = ? AND id = ?", userId, id).Delete(&entity.ResearchJournals{}).Error
|
|
return
|
|
}
|