Compare commits
3 Commits
a47b7b7d3d
...
1ae192ccef
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1ae192ccef | ||
|
|
213d370332 | ||
|
|
13c976dcbf |
11
database/ads_model.go
Normal file
11
database/ads_model.go
Normal file
@ -0,0 +1,11 @@
|
||||
package database
|
||||
|
||||
import "time"
|
||||
|
||||
type Ads struct {
|
||||
ID string `gorm:"primaryKey;not null" json:"id"`
|
||||
ImageUrl string `gorm:"not null" json:"image_url"`
|
||||
Url string `gorm:"not null" json:"url"`
|
||||
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
|
||||
}
|
||||
@ -54,5 +54,6 @@ func (db *DB) Migrate() error {
|
||||
&News{},
|
||||
&Tag{},
|
||||
&Category{},
|
||||
&Ads{},
|
||||
)
|
||||
}
|
||||
|
||||
14
internal/accessor/ads/create.go
Normal file
14
internal/accessor/ads/create.go
Normal file
@ -0,0 +1,14 @@
|
||||
package adsrepository
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
adsdomain "legalgo-BE-go/internal/domain/ads"
|
||||
)
|
||||
|
||||
func (a *accessor) Create(spec adsdomain.Ads) error {
|
||||
if err := a.db.Create(&spec).Error; err != nil {
|
||||
return fmt.Errorf("failed to create ads: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
15
internal/accessor/ads/get-all.go
Normal file
15
internal/accessor/ads/get-all.go
Normal file
@ -0,0 +1,15 @@
|
||||
package adsrepository
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
adsdomain "legalgo-BE-go/internal/domain/ads"
|
||||
)
|
||||
|
||||
func (a *accessor) GetAll() ([]adsdomain.Ads, error) {
|
||||
var ads []adsdomain.Ads
|
||||
if err := a.db.Find(&ads).Error; err != nil {
|
||||
return ads, fmt.Errorf("failed to get all ads: %v", err)
|
||||
}
|
||||
|
||||
return ads, nil
|
||||
}
|
||||
21
internal/accessor/ads/impl.go
Normal file
21
internal/accessor/ads/impl.go
Normal file
@ -0,0 +1,21 @@
|
||||
package adsrepository
|
||||
|
||||
import (
|
||||
"legalgo-BE-go/database"
|
||||
adsdomain "legalgo-BE-go/internal/domain/ads"
|
||||
)
|
||||
|
||||
type accessor struct {
|
||||
db *database.DB
|
||||
}
|
||||
|
||||
type Ads interface {
|
||||
Create(adsdomain.Ads) error
|
||||
GetAll() ([]adsdomain.Ads, error)
|
||||
}
|
||||
|
||||
func New(
|
||||
db *database.DB,
|
||||
) Ads {
|
||||
return &accessor{db}
|
||||
}
|
||||
@ -1,13 +1,14 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
adsrepository "legalgo-BE-go/internal/accessor/ads"
|
||||
categoryrepository "legalgo-BE-go/internal/accessor/category"
|
||||
newsrepository "legalgo-BE-go/internal/accessor/news"
|
||||
"legalgo-BE-go/internal/accessor/oss"
|
||||
redisaccessor "legalgo-BE-go/internal/accessor/redis"
|
||||
staffrepository "legalgo-BE-go/internal/accessor/staff"
|
||||
subscriberepository "legalgo-BE-go/internal/accessor/subscribe"
|
||||
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribeplan"
|
||||
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribe_plan"
|
||||
tagrepository "legalgo-BE-go/internal/accessor/tag"
|
||||
userrepository "legalgo-BE-go/internal/accessor/user"
|
||||
|
||||
@ -24,4 +25,5 @@ var Module = fx.Module("repository", fx.Provide(
|
||||
categoryrepository.New,
|
||||
newsrepository.New,
|
||||
oss.New,
|
||||
adsrepository.New,
|
||||
))
|
||||
|
||||
@ -68,3 +68,19 @@ func (r *OssRepositoryImpl) GetPublicURL(fileName string) string {
|
||||
}
|
||||
return fmt.Sprintf("%s:%s%s", r.cfg.GetPublicURL(), r.cfg.GetBucketName(), fileName)
|
||||
}
|
||||
|
||||
func (r *OssRepositoryImpl) DeleteObject(ctx context.Context, fileName string) error {
|
||||
if fileName == "" {
|
||||
return fmt.Errorf("file name is not provided")
|
||||
}
|
||||
|
||||
_, err := r.s3.DeleteObject(&s3.DeleteObjectInput{
|
||||
Key: aws.String(fileName),
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("failed to delete object %s from bucket: %v", fileName, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@ -7,4 +7,5 @@ import (
|
||||
type OSSRepository interface {
|
||||
UploadFile(ctx context.Context, fileName string, fileContent []byte) (fileUrl string, err error)
|
||||
GetPublicURL(fileName string) string
|
||||
DeleteObject(ctx context.Context, fileName string) error
|
||||
}
|
||||
|
||||
@ -6,13 +6,13 @@ import (
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func (s *SubsAccs) Create(subsPlanId string) (string, error) {
|
||||
func (s *accessor) Create(subsPlanId string) (string, error) {
|
||||
spec := &subscribedomain.Subscribe{
|
||||
ID: uuid.NewString(),
|
||||
SubscribePlanID: subsPlanId,
|
||||
}
|
||||
|
||||
if err := s.DB.Create(&spec).Error; err != nil {
|
||||
if err := s.db.Create(&spec).Error; err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
|
||||
@ -3,15 +3,15 @@ package subscriberepository
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"legalgo-BE-go/database"
|
||||
subscribedomain "legalgo-BE-go/internal/domain/subscribe"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func (s *SubsAccs) GetByID(id string) (database.Subscribe, error) {
|
||||
var subscribe database.Subscribe
|
||||
func (s *accessor) GetByID(id string) (subscribedomain.Subscribe, error) {
|
||||
var subscribe subscribedomain.Subscribe
|
||||
|
||||
if err := s.DB.First(&subscribe, "id = ?", id).Error; err != nil {
|
||||
if err := s.db.First(&subscribe, "id = ?", id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return subscribe, fmt.Errorf("subscribe data not found: %v", err)
|
||||
}
|
||||
|
||||
@ -1,17 +1,20 @@
|
||||
package subscriberepository
|
||||
|
||||
import "legalgo-BE-go/database"
|
||||
import (
|
||||
"legalgo-BE-go/database"
|
||||
subscribedomain "legalgo-BE-go/internal/domain/subscribe"
|
||||
)
|
||||
|
||||
type SubsAccs struct {
|
||||
DB *database.DB
|
||||
type accessor struct {
|
||||
db *database.DB
|
||||
}
|
||||
|
||||
type SubsIntf interface {
|
||||
type Subscribe interface {
|
||||
Create(string) (string, error)
|
||||
GetByID(string) (database.Subscribe, error)
|
||||
UpdateSubscribeStatus(database.Subscribe) error
|
||||
GetByID(string) (subscribedomain.Subscribe, error)
|
||||
Update(subscribedomain.Subscribe) error
|
||||
}
|
||||
|
||||
func New(db *database.DB) SubsIntf {
|
||||
return &SubsAccs{db}
|
||||
func New(db *database.DB) Subscribe {
|
||||
return &accessor{db}
|
||||
}
|
||||
|
||||
19
internal/accessor/subscribe/update.go
Normal file
19
internal/accessor/subscribe/update.go
Normal file
@ -0,0 +1,19 @@
|
||||
package subscriberepository
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
subscribedomain "legalgo-BE-go/internal/domain/subscribe"
|
||||
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
func (a *accessor) Update(spec subscribedomain.Subscribe) error {
|
||||
if err := a.db.Clauses(clause.OnConflict{
|
||||
Columns: []clause.Column{{Name: "id"}},
|
||||
DoUpdates: clause.AssignmentColumns([]string{"status", "subscribe_plan_id", "start_date"}),
|
||||
}).Create(&spec).Error; err != nil {
|
||||
return fmt.Errorf("failed to update status: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -1,19 +0,0 @@
|
||||
package subscriberepository
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"legalgo-BE-go/database"
|
||||
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
func (a *SubsAccs) UpdateSubscribeStatus(spec database.Subscribe) error {
|
||||
if err := a.DB.Clauses(clause.OnConflict{
|
||||
Columns: []clause.Column{{Name: "id"}},
|
||||
DoUpdates: clause.AssignmentColumns([]string{"status"}),
|
||||
}).Create(&spec).Error; err != nil {
|
||||
return fmt.Errorf("failed to update status: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
13
internal/accessor/subscribe_plan/create.go
Normal file
13
internal/accessor/subscribe_plan/create.go
Normal file
@ -0,0 +1,13 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
)
|
||||
|
||||
func (s *accessor) Create(spec subscribeplandomain.SubscribePlan) error {
|
||||
if err := s.db.Create(&spec).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
30
internal/accessor/subscribe_plan/delete.go
Normal file
30
internal/accessor/subscribe_plan/delete.go
Normal file
@ -0,0 +1,30 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"legalgo-BE-go/database"
|
||||
subscribedomain "legalgo-BE-go/internal/domain/subscribe"
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
)
|
||||
|
||||
func (a *accessor) Delete(id string) error {
|
||||
var subsPlan database.SubscribePlan
|
||||
var basicPlan subscribeplandomain.SubscribePlan
|
||||
|
||||
if err := a.db.First(&basicPlan, "code = ?", "basic").Error; err != nil {
|
||||
return fmt.Errorf("failed to find basic plan: %v", err)
|
||||
}
|
||||
|
||||
if err := a.db.
|
||||
Model(&subscribedomain.Subscribe{}).
|
||||
Where("subscribe_plan_id = ?", id).
|
||||
Update("subscribe_plan_id", basicPlan.ID); err != nil {
|
||||
return fmt.Errorf("failed to change subscribe plan: %v", err)
|
||||
}
|
||||
|
||||
if err := a.db.Where("id = ?", id).Delete(&subsPlan).Error; err != nil {
|
||||
return fmt.Errorf("failed to delete subscribe plan %s : %v", id, err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -4,10 +4,10 @@ import (
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
)
|
||||
|
||||
func (s *SubsPlan) GetAll() ([]subscribeplandomain.SubscribePlan, error) {
|
||||
func (s *accessor) GetAll() ([]subscribeplandomain.SubscribePlan, error) {
|
||||
var subscribePlans []subscribeplandomain.SubscribePlan
|
||||
|
||||
if err := s.DB.Find(&subscribePlans).Error; err != nil {
|
||||
if err := s.db.Find(&subscribePlans).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
21
internal/accessor/subscribe_plan/get_by_id.go
Normal file
21
internal/accessor/subscribe_plan/get_by_id.go
Normal file
@ -0,0 +1,21 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
"errors"
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func (s *accessor) GetByID(id string) (*subscribeplandomain.SubscribePlan, error) {
|
||||
var subscribePlan *subscribeplandomain.SubscribePlan
|
||||
|
||||
if err := s.db.First(&subscribePlan, "id = ? ", id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return subscribePlan, errors.New("subscribe plan not found")
|
||||
}
|
||||
return subscribePlan, err
|
||||
}
|
||||
|
||||
return subscribePlan, nil
|
||||
}
|
||||
22
internal/accessor/subscribe_plan/get_default.go
Normal file
22
internal/accessor/subscribe_plan/get_default.go
Normal file
@ -0,0 +1,22 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
"legalgo-BE-go/database"
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func (s *accessor) GetDefault() (*subscribeplandomain.SubscribePlan, error) {
|
||||
var subscribePlan *subscribeplandomain.SubscribePlan
|
||||
|
||||
if err := s.db.First(&subscribePlan, "code = ?", "basic").Error; err != nil {
|
||||
s.db.Create(&database.SubscribePlan{
|
||||
ID: uuid.NewString(),
|
||||
Code: "basic",
|
||||
Name: "Basic",
|
||||
})
|
||||
}
|
||||
|
||||
return subscribePlan, nil
|
||||
}
|
||||
25
internal/accessor/subscribe_plan/impl.go
Normal file
25
internal/accessor/subscribe_plan/impl.go
Normal file
@ -0,0 +1,25 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
"legalgo-BE-go/database"
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
)
|
||||
|
||||
type accessor struct {
|
||||
db *database.DB
|
||||
}
|
||||
|
||||
type SubscribePlan interface {
|
||||
Create(subscribeplandomain.SubscribePlan) error
|
||||
GetAll() ([]subscribeplandomain.SubscribePlan, error)
|
||||
GetByID(string) (*subscribeplandomain.SubscribePlan, error)
|
||||
GetDefault() (*subscribeplandomain.SubscribePlan, error)
|
||||
Update(subscribeplandomain.SubscribePlan) error
|
||||
Delete(string) error
|
||||
}
|
||||
|
||||
func New(
|
||||
db *database.DB,
|
||||
) SubscribePlan {
|
||||
return &accessor{db}
|
||||
}
|
||||
23
internal/accessor/subscribe_plan/update.go
Normal file
23
internal/accessor/subscribe_plan/update.go
Normal file
@ -0,0 +1,23 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
|
||||
"gorm.io/gorm/clause"
|
||||
)
|
||||
|
||||
func (a *accessor) Update(spec subscribeplandomain.SubscribePlan) error {
|
||||
if err := a.db.Clauses(clause.OnConflict{
|
||||
Columns: []clause.Column{{Name: "id"}},
|
||||
DoUpdates: clause.AssignmentColumns([]string{
|
||||
"name",
|
||||
"code",
|
||||
"updated_at",
|
||||
}),
|
||||
}).Select("name", "code", "updated_at").Save(&spec).Error; err != nil {
|
||||
return fmt.Errorf("failed to update tag: %v", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func (s *SubsPlan) Create(spec subscribeplandomain.SubscribePlanReq) error {
|
||||
data := &subscribeplandomain.SubscribePlan{
|
||||
ID: uuid.NewString(),
|
||||
Code: spec.Code,
|
||||
Name: spec.Name,
|
||||
}
|
||||
|
||||
if err := s.DB.Create(&data).Error; err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"legalgo-BE-go/database"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func (s *SubsPlan) GetByID(id string) (*database.SubscribePlan, error) {
|
||||
var subscribePlan *database.SubscribePlan
|
||||
|
||||
if err := s.DB.First(&subscribePlan, "id = ? ", id).Error; err != nil {
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return subscribePlan, errors.New("subscribe plan not found")
|
||||
}
|
||||
return subscribePlan, err
|
||||
}
|
||||
|
||||
return subscribePlan, nil
|
||||
}
|
||||
@ -1,21 +0,0 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
"legalgo-BE-go/database"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func (s *SubsPlan) GetDefault() (*database.SubscribePlan, error) {
|
||||
var subscribePlan *database.SubscribePlan
|
||||
|
||||
if err := s.DB.First(&subscribePlan, "code = ?", "basic").Error; err != nil {
|
||||
s.DB.Create(&database.SubscribePlan{
|
||||
ID: uuid.NewString(),
|
||||
Code: "basic",
|
||||
Name: "Basic",
|
||||
})
|
||||
}
|
||||
|
||||
return subscribePlan, nil
|
||||
}
|
||||
@ -1,23 +0,0 @@
|
||||
package subscribeplanrepository
|
||||
|
||||
import (
|
||||
"legalgo-BE-go/database"
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
)
|
||||
|
||||
type SubsPlan struct {
|
||||
DB *database.DB
|
||||
}
|
||||
|
||||
type SubsPlanIntf interface {
|
||||
Create(subscribeplandomain.SubscribePlanReq) error
|
||||
GetAll() ([]subscribeplandomain.SubscribePlan, error)
|
||||
GetByID(string) (*database.SubscribePlan, error)
|
||||
GetDefault() (*database.SubscribePlan, error)
|
||||
}
|
||||
|
||||
func New(
|
||||
db *database.DB,
|
||||
) SubsPlanIntf {
|
||||
return &SubsPlan{db}
|
||||
}
|
||||
106
internal/api/http/ads/create.go
Normal file
106
internal/api/http/ads/create.go
Normal file
@ -0,0 +1,106 @@
|
||||
package adshttp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
|
||||
adsdomain "legalgo-BE-go/internal/domain/ads"
|
||||
"legalgo-BE-go/internal/domain/oss"
|
||||
adssvc "legalgo-BE-go/internal/services/ads"
|
||||
"legalgo-BE-go/internal/utilities/response"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
)
|
||||
|
||||
const _oneMB = 1 << 20
|
||||
const _maxUploadSize = 2 * _oneMB
|
||||
const _folderName = "/file"
|
||||
|
||||
func Create(
|
||||
router chi.Router,
|
||||
adsSvc adssvc.Ads,
|
||||
) {
|
||||
router.With(authmiddleware.Authorize()).Post("/ads/create", func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
|
||||
err := r.ParseMultipartForm(10 << 20) // 10 MB
|
||||
if err != nil {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
err,
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
"unable to parse form",
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
url := r.FormValue("url")
|
||||
if url == "" {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
err,
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
"URL is missing",
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
file, header, err := r.FormFile("image")
|
||||
if err != nil {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
err,
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
"unable to retrieve image",
|
||||
)
|
||||
return
|
||||
}
|
||||
defer file.Close()
|
||||
|
||||
if header.Size > int64(_maxUploadSize) {
|
||||
response.ResponseWithErrorCode(
|
||||
ctx,
|
||||
w,
|
||||
fmt.Errorf("file too big"),
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
fmt.Sprintf("The file is too big. The maximum size is %d MB", _maxUploadSize/_oneMB),
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
imageRequest := &oss.UploadFileRequest{
|
||||
FileHeader: header,
|
||||
FolderName: _folderName,
|
||||
}
|
||||
|
||||
adsReq := adsdomain.AdsReq{
|
||||
Image: imageRequest,
|
||||
Url: url,
|
||||
}
|
||||
|
||||
if err := adsSvc.Create(ctx, adsReq); err != nil {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
err,
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
err.Error(),
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
response.RespondJsonSuccess(ctx, w, struct {
|
||||
Message string
|
||||
}{
|
||||
Message: "ads created successfully",
|
||||
})
|
||||
})
|
||||
}
|
||||
32
internal/api/http/ads/get_all.go
Normal file
32
internal/api/http/ads/get_all.go
Normal file
@ -0,0 +1,32 @@
|
||||
package adshttp
|
||||
|
||||
import (
|
||||
adssvc "legalgo-BE-go/internal/services/ads"
|
||||
"legalgo-BE-go/internal/utilities/response"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
)
|
||||
|
||||
func GetAll(
|
||||
router chi.Router,
|
||||
adsSvc adssvc.Ads,
|
||||
) {
|
||||
router.Get("/ads", func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
subsPlan, err := adsSvc.GetAll()
|
||||
if err != nil {
|
||||
response.ResponseWithErrorCode(
|
||||
ctx,
|
||||
w,
|
||||
err,
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
err.Error(),
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
response.RespondJsonSuccess(ctx, w, subsPlan)
|
||||
})
|
||||
}
|
||||
8
internal/api/http/ads/module.go
Normal file
8
internal/api/http/ads/module.go
Normal file
@ -0,0 +1,8 @@
|
||||
package adshttp
|
||||
|
||||
import "go.uber.org/fx"
|
||||
|
||||
var Module = fx.Module("ads-http", fx.Invoke(
|
||||
Create,
|
||||
GetAll,
|
||||
))
|
||||
@ -1,10 +1,12 @@
|
||||
package internalhttp
|
||||
|
||||
import (
|
||||
adshttp "legalgo-BE-go/internal/api/http/ads"
|
||||
categoryhttp "legalgo-BE-go/internal/api/http/category"
|
||||
newshttp "legalgo-BE-go/internal/api/http/news"
|
||||
osshttp "legalgo-BE-go/internal/api/http/oss"
|
||||
staffhttp "legalgo-BE-go/internal/api/http/staffhttp"
|
||||
subscribehttp "legalgo-BE-go/internal/api/http/subscribe"
|
||||
subscribeplanhttp "legalgo-BE-go/internal/api/http/subscribe_plan"
|
||||
taghttp "legalgo-BE-go/internal/api/http/tag"
|
||||
userhttp "legalgo-BE-go/internal/api/http/user"
|
||||
@ -29,6 +31,8 @@ var Module = fx.Module("router",
|
||||
newshttp.Module,
|
||||
osshttp.Module,
|
||||
userhttp.Module,
|
||||
subscribehttp.Module,
|
||||
adshttp.Module,
|
||||
)
|
||||
|
||||
func initRouter() chi.Router {
|
||||
|
||||
@ -2,4 +2,6 @@ package subscribehttp
|
||||
|
||||
import "go.uber.org/fx"
|
||||
|
||||
var Module = fx.Module("subscribe", fx.Invoke())
|
||||
var Module = fx.Module("subscribe", fx.Invoke(
|
||||
Update,
|
||||
))
|
||||
|
||||
@ -1,9 +1,9 @@
|
||||
package subscribehttp
|
||||
|
||||
import (
|
||||
userrepository "legalgo-BE-go/internal/accessor/user"
|
||||
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
|
||||
userdomain "legalgo-BE-go/internal/domain/user"
|
||||
authsvc "legalgo-BE-go/internal/services/auth"
|
||||
subscribesvc "legalgo-BE-go/internal/services/subscribe"
|
||||
"legalgo-BE-go/internal/utilities/response"
|
||||
"legalgo-BE-go/internal/utilities/utils"
|
||||
@ -14,7 +14,7 @@ import (
|
||||
|
||||
func Update(
|
||||
router chi.Router,
|
||||
authSvc authsvc.Auth,
|
||||
userRepo userrepository.User,
|
||||
subSvc subscribesvc.Subscribe,
|
||||
) {
|
||||
router.
|
||||
@ -60,9 +60,11 @@ func Update(
|
||||
return
|
||||
}
|
||||
|
||||
user, err := authSvc.GetUserProfile(detail.Email)
|
||||
user, err := userRepo.GetUserProfile(detail.Email)
|
||||
|
||||
if err := subSvc.Update(user.ID, body); err != nil {
|
||||
body.ID = user.Subscribe.ID
|
||||
|
||||
if err := subSvc.Update(body); err != nil {
|
||||
response.ResponseWithErrorCode(
|
||||
ctx,
|
||||
w,
|
||||
@ -73,5 +75,11 @@ func Update(
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
response.RespondJsonSuccess(ctx, w, struct {
|
||||
Message string
|
||||
}{
|
||||
Message: "update user plan success",
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
@ -49,7 +49,7 @@ func CreateSubscribePlan(
|
||||
return
|
||||
}
|
||||
|
||||
if err := subsSvc.CreatePlan(spec); err != nil {
|
||||
if err := subsSvc.Create(spec); err != nil {
|
||||
response.ResponseWithErrorCode(
|
||||
ctx,
|
||||
w,
|
||||
|
||||
53
internal/api/http/subscribe_plan/delete.go
Normal file
53
internal/api/http/subscribe_plan/delete.go
Normal file
@ -0,0 +1,53 @@
|
||||
package subscribeplanhttp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
|
||||
subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan"
|
||||
"legalgo-BE-go/internal/utilities/response"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
)
|
||||
|
||||
func Delete(
|
||||
router chi.Router,
|
||||
subscribePlanSvc subscribeplansvc.SubscribePlan,
|
||||
) {
|
||||
router.
|
||||
With(authmiddleware.Authorize()).
|
||||
Delete("/subscribe-plan/{subsplan_id}/delete", func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
subsPlanID := chi.URLParam(r, "subsplan_id")
|
||||
|
||||
if subsPlanID == "" {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
fmt.Errorf("subscribe plan id is not provided"),
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
"subscribe plan id is not provided",
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
if err := subscribePlanSvc.Delete(subsPlanID); err != nil {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
err,
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
err.Error(),
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
response.RespondJsonSuccess(ctx, w, struct {
|
||||
Message string
|
||||
}{
|
||||
Message: "subscribe plan has been deleted",
|
||||
})
|
||||
})
|
||||
}
|
||||
@ -6,5 +6,7 @@ var Module = fx.Module("subscribe-plan",
|
||||
fx.Invoke(
|
||||
CreateSubscribePlan,
|
||||
GetAllPlan,
|
||||
Update,
|
||||
Delete,
|
||||
),
|
||||
)
|
||||
|
||||
82
internal/api/http/subscribe_plan/update.go
Normal file
82
internal/api/http/subscribe_plan/update.go
Normal file
@ -0,0 +1,82 @@
|
||||
package subscribeplanhttp
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan"
|
||||
"legalgo-BE-go/internal/utilities/response"
|
||||
"legalgo-BE-go/internal/utilities/utils"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/go-playground/validator/v10"
|
||||
)
|
||||
|
||||
func Update(
|
||||
router chi.Router,
|
||||
validate *validator.Validate,
|
||||
subsPlanSvc subscribeplansvc.SubscribePlan,
|
||||
) {
|
||||
router.
|
||||
With(authmiddleware.Authorize()).
|
||||
Put("/subscribe-plan/{subsplan_id}/update", func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
tagID := chi.URLParam(r, "subsplan_id")
|
||||
|
||||
if tagID == "" {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
fmt.Errorf("subscribe plan id is not provided"),
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
"subscribe plan id is not provided",
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
var spec subscribeplandomain.SubscribePlanUpdate
|
||||
if err := utils.UnmarshalBody(r, &spec); err != nil {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
err,
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
"failed to unmarshal body",
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
if err := validate.Struct(spec); err != nil {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
err,
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
err.(validator.ValidationErrors).Error(),
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
if err := subsPlanSvc.Update(tagID, spec); err != nil {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
err,
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
err.Error(),
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
response.RespondJsonSuccess(ctx, w, struct {
|
||||
Message string
|
||||
}{
|
||||
Message: "update subscribe plan success",
|
||||
})
|
||||
})
|
||||
}
|
||||
@ -16,23 +16,23 @@ func Delete(
|
||||
) {
|
||||
router.
|
||||
With(authmiddleware.Authorize()).
|
||||
Delete("/tag/{category_id}/delete", func(w http.ResponseWriter, r *http.Request) {
|
||||
Delete("/tag/{tag_id}/delete", func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
categoryID := chi.URLParam(r, "category_id")
|
||||
tagID := chi.URLParam(r, "tag_id")
|
||||
|
||||
if categoryID == "" {
|
||||
if tagID == "" {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
fmt.Errorf("category id is not provided"),
|
||||
fmt.Errorf("tag id is not provided"),
|
||||
response.ErrBadRequest.Code,
|
||||
response.ErrBadRequest.HttpCode,
|
||||
"category id is not provided",
|
||||
"tag id is not provided",
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
if err := tagSvc.Delete(categoryID); err != nil {
|
||||
if err := tagSvc.Delete(tagID); err != nil {
|
||||
response.RespondJsonErrorWithCode(
|
||||
ctx,
|
||||
w,
|
||||
|
||||
@ -14,8 +14,7 @@ func GetAll(
|
||||
) {
|
||||
router.Get("/tag", func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
tags, err := tagSvc.GetAllModel()
|
||||
// tags, err := tagSvc.GetAll()
|
||||
tags, err := tagSvc.GetAll()
|
||||
if err != nil {
|
||||
response.ResponseWithErrorCode(
|
||||
ctx,
|
||||
|
||||
@ -3,7 +3,7 @@ package userhttp
|
||||
import (
|
||||
responsedomain "legalgo-BE-go/internal/domain/reponse"
|
||||
userdomain "legalgo-BE-go/internal/domain/user"
|
||||
authsvc "legalgo-BE-go/internal/services/auth"
|
||||
usersvc "legalgo-BE-go/internal/services/user"
|
||||
"legalgo-BE-go/internal/utilities/response"
|
||||
"legalgo-BE-go/internal/utilities/utils"
|
||||
"net/http"
|
||||
@ -15,7 +15,7 @@ import (
|
||||
|
||||
func Login(
|
||||
router chi.Router,
|
||||
authSvc authsvc.Auth,
|
||||
userSvc usersvc.User,
|
||||
validate *validator.Validate,
|
||||
rdb *redis.Client,
|
||||
) {
|
||||
@ -48,7 +48,7 @@ func Login(
|
||||
return
|
||||
}
|
||||
|
||||
token, err := authSvc.LoginAsUser(spec)
|
||||
token, err := userSvc.LoginAsUser(spec)
|
||||
if err != nil {
|
||||
response.ResponseWithErrorCode(
|
||||
ctx,
|
||||
|
||||
@ -1,7 +1,7 @@
|
||||
package userhttp
|
||||
|
||||
import (
|
||||
authsvc "legalgo-BE-go/internal/services/auth"
|
||||
usersvc "legalgo-BE-go/internal/services/user"
|
||||
"legalgo-BE-go/internal/utilities/response"
|
||||
"legalgo-BE-go/internal/utilities/utils"
|
||||
"net/http"
|
||||
@ -11,7 +11,7 @@ import (
|
||||
|
||||
func GetProfile(
|
||||
router chi.Router,
|
||||
authSvc authsvc.Auth,
|
||||
userSvc usersvc.User,
|
||||
) {
|
||||
router.Get("/user/profile", func(w http.ResponseWriter, r *http.Request) {
|
||||
ctx := r.Context()
|
||||
@ -28,7 +28,7 @@ func GetProfile(
|
||||
return
|
||||
}
|
||||
|
||||
userProfile, err := authSvc.GetUserProfile(destructedToken.Email)
|
||||
userProfile, err := userSvc.GetUserProfile(destructedToken.Email)
|
||||
if err != nil {
|
||||
response.ResponseWithErrorCode(
|
||||
ctx,
|
||||
|
||||
@ -3,7 +3,7 @@ package userhttp
|
||||
import (
|
||||
responsedomain "legalgo-BE-go/internal/domain/reponse"
|
||||
userdomain "legalgo-BE-go/internal/domain/user"
|
||||
authsvc "legalgo-BE-go/internal/services/auth"
|
||||
usersvc "legalgo-BE-go/internal/services/user"
|
||||
"legalgo-BE-go/internal/utilities/response"
|
||||
"legalgo-BE-go/internal/utilities/utils"
|
||||
"net/http"
|
||||
@ -16,7 +16,7 @@ import (
|
||||
func Register(
|
||||
router chi.Router,
|
||||
validate *validator.Validate,
|
||||
authSvc authsvc.Auth,
|
||||
authSvc usersvc.User,
|
||||
rdb *redis.Client,
|
||||
) {
|
||||
router.Post("/user/register", func(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
19
internal/domain/ads/spec.go
Normal file
19
internal/domain/ads/spec.go
Normal file
@ -0,0 +1,19 @@
|
||||
package adsdomain
|
||||
|
||||
import (
|
||||
"legalgo-BE-go/internal/domain/oss"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Ads struct {
|
||||
ID string `gorm:"primaryKey;not null" json:"id"`
|
||||
ImageUrl string `gorm:"not null" json:"image_url"`
|
||||
Url string `gorm:"not null" json:"url"`
|
||||
CreatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"created_at"`
|
||||
UpdatedAt time.Time `gorm:"default:CURRENT_TIMESTAMP" json:"updated_at"`
|
||||
}
|
||||
|
||||
type AdsReq struct {
|
||||
Image *oss.UploadFileRequest `json:"image"`
|
||||
Url string `json:"url"`
|
||||
}
|
||||
@ -1,28 +1,18 @@
|
||||
package subscribedomain
|
||||
|
||||
import (
|
||||
subscribeplandm "legalgo-BE-go/internal/domain/subscribe_plan_model"
|
||||
subscribeplan "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
"time"
|
||||
)
|
||||
|
||||
type SubscribeDepecrate struct {
|
||||
ID string `json:"id"`
|
||||
SubscribePlanID string `json:"subscribe_plan_id"`
|
||||
}
|
||||
|
||||
type SubscribeUpdateReqDepecrate struct {
|
||||
ID string `json:"id"`
|
||||
Status string `json:"status"`
|
||||
}
|
||||
|
||||
// refactored
|
||||
type Subscribe struct {
|
||||
ID string `gorm:"primaryKey" json:"id"`
|
||||
SubscribePlanID string `gorm:"not null" json:"subscribe_plan_id"`
|
||||
StartDate time.Time `gorm:"default:CURRENT_TIMESTAMP"`
|
||||
EndDate time.Time `gorm:"default:null"`
|
||||
Status string `gorm:"default:'inactive'"`
|
||||
AutoRenew bool `gorm:"default:true"`
|
||||
ID string `json:"id"`
|
||||
SubscribePlanID string `json:"subscribe_plan_id"`
|
||||
StartDate time.Time `json:"start_date"`
|
||||
EndDate *time.Time `json:"end_date"`
|
||||
Status string `json:"status"`
|
||||
AutoRenew bool `json:"auto_renew"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
|
||||
SubscribePlan subscribeplandm.SubscribePlan `gorm:"foreignKey:SubscribePlanID;constraint:OnDelete:CASCADE" json:"subscribe_plan"`
|
||||
SubscribePlan subscribeplan.SubscribePlan `gorm:"foreignKey:SubscribePlanID" json:"subscribe_plan"`
|
||||
}
|
||||
|
||||
@ -1,17 +0,0 @@
|
||||
package subscribedm
|
||||
|
||||
import (
|
||||
subscribeplandm "legalgo-BE-go/internal/domain/subscribe_plan_model"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Subscribe struct {
|
||||
ID string `json:"id"`
|
||||
SubscribePlanID string `json:"subscribe_plan_id"`
|
||||
StartDate time.Time `json:"start_date"`
|
||||
EndDate *time.Time `json:"end_date"`
|
||||
Status string `json:"status"`
|
||||
AutoRenew bool `json:"auto_renew"`
|
||||
|
||||
SubscribePlan subscribeplandm.SubscribePlan `gorm:"foreignKey:SubscribePlanID" json:"subscribe_plan"`
|
||||
}
|
||||
@ -1,12 +1,22 @@
|
||||
package subscribeplandomain
|
||||
|
||||
import "time"
|
||||
|
||||
type SubscribePlan struct {
|
||||
ID string `json:"id"`
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type SubscribePlanUpdate struct {
|
||||
Code string `json:"code" validate:"required"`
|
||||
Name string `json:"name" validate:"required"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
type SubscribePlanReq struct {
|
||||
Code string `json:"code" validate:"required"`
|
||||
Name string `json:"name" validate:"required"`
|
||||
}
|
||||
|
||||
type SubscribePlan struct {
|
||||
ID string `json:"id"`
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
|
||||
@ -1,8 +0,0 @@
|
||||
package subscribeplandm
|
||||
|
||||
// refactored
|
||||
type SubscribePlan struct {
|
||||
ID string `json:"id"`
|
||||
Code string `json:"code"`
|
||||
Name string `json:"name"`
|
||||
}
|
||||
@ -1,6 +1,9 @@
|
||||
package userdomain
|
||||
|
||||
import subscribedm "legalgo-BE-go/internal/domain/subscribe_model"
|
||||
import (
|
||||
subscribe "legalgo-BE-go/internal/domain/subscribe"
|
||||
"time"
|
||||
)
|
||||
|
||||
type User struct {
|
||||
ID string `json:"id"`
|
||||
@ -9,7 +12,7 @@ type User struct {
|
||||
Email string `json:"email"`
|
||||
Phone string `json:"phone"`
|
||||
|
||||
Subscribe subscribedm.Subscribe `gorm:"foreignKey:SubscribeID" json:"subscribe"`
|
||||
Subscribe subscribe.Subscribe `gorm:"foreignKey:SubscribeID" json:"subscribe"`
|
||||
}
|
||||
|
||||
type UserRegister struct {
|
||||
@ -24,7 +27,7 @@ type UserProfile struct {
|
||||
Email string `json:"email"`
|
||||
Phone string `json:"phone"`
|
||||
|
||||
Subscribe subscribedm.Subscribe `gorm:"foreignKey:SubscribeID" json:"subscribe"`
|
||||
Subscribe subscribe.Subscribe `gorm:"foreignKey:SubscribeID" json:"subscribe"`
|
||||
}
|
||||
|
||||
type UserLogin struct {
|
||||
@ -33,5 +36,10 @@ type UserLogin struct {
|
||||
}
|
||||
|
||||
type UserSubsUpdate struct {
|
||||
Status string `json:"status"`
|
||||
ID string `json:"id"`
|
||||
Status string `json:"status"`
|
||||
SubscribePlanID string `json:"subscribe_plan_id"`
|
||||
AutoRenew bool `json:"auto_renew"`
|
||||
StartDate time.Time `json:"start_date"`
|
||||
EndDate *time.Time `json:"end_date"`
|
||||
}
|
||||
|
||||
56
internal/services/ads/create.go
Normal file
56
internal/services/ads/create.go
Normal file
@ -0,0 +1,56 @@
|
||||
package adssvc
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
adsdomain "legalgo-BE-go/internal/domain/ads"
|
||||
"path"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func (i *impl) Create(ctx context.Context, spec adsdomain.AdsReq) error {
|
||||
id := uuid.NewString()
|
||||
|
||||
file := spec.Image.FileHeader
|
||||
spec.Image.FileSize = file.Size
|
||||
spec.Image.Ext = path.Ext(file.Filename)
|
||||
|
||||
if err := i.validate.Struct(spec); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// Open the file and read its content
|
||||
srcFile, err := file.Open()
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
defer srcFile.Close()
|
||||
|
||||
fileContent := make([]byte, file.Size)
|
||||
_, err = srcFile.Read(fileContent)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
filePath := fmt.Sprintf("%v/%v%v", spec.Image.FolderName, id, spec.Image.Ext)
|
||||
fileUrl, err := i.ossRepo.UploadFile(ctx, filePath, fileContent)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
newSpec := adsdomain.Ads{
|
||||
ID: id,
|
||||
ImageUrl: fileUrl,
|
||||
Url: spec.Url,
|
||||
}
|
||||
|
||||
if err := i.adsRepo.Create(newSpec); err != nil {
|
||||
if err := i.ossRepo.DeleteObject(ctx, id); err != nil {
|
||||
return err
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
7
internal/services/ads/get_all.go
Normal file
7
internal/services/ads/get_all.go
Normal file
@ -0,0 +1,7 @@
|
||||
package adssvc
|
||||
|
||||
import adsdomain "legalgo-BE-go/internal/domain/ads"
|
||||
|
||||
func (i *impl) GetAll() ([]adsdomain.Ads, error) {
|
||||
return i.adsRepo.GetAll()
|
||||
}
|
||||
33
internal/services/ads/impl.go
Normal file
33
internal/services/ads/impl.go
Normal file
@ -0,0 +1,33 @@
|
||||
package adssvc
|
||||
|
||||
import (
|
||||
"context"
|
||||
adsrepository "legalgo-BE-go/internal/accessor/ads"
|
||||
"legalgo-BE-go/internal/accessor/oss"
|
||||
adsdomain "legalgo-BE-go/internal/domain/ads"
|
||||
|
||||
"github.com/go-playground/validator/v10"
|
||||
)
|
||||
|
||||
type impl struct {
|
||||
ossRepo oss.OSSRepository
|
||||
adsRepo adsrepository.Ads
|
||||
validate *validator.Validate
|
||||
}
|
||||
|
||||
type Ads interface {
|
||||
Create(context.Context, adsdomain.AdsReq) error
|
||||
GetAll() ([]adsdomain.Ads, error)
|
||||
}
|
||||
|
||||
func New(
|
||||
ossRepo oss.OSSRepository,
|
||||
adsRepo adsrepository.Ads,
|
||||
validate *validator.Validate,
|
||||
) Ads {
|
||||
return &impl{
|
||||
ossRepo,
|
||||
adsRepo,
|
||||
validate,
|
||||
}
|
||||
}
|
||||
@ -1,14 +0,0 @@
|
||||
package authsvc
|
||||
|
||||
import (
|
||||
userdomain "legalgo-BE-go/internal/domain/user"
|
||||
)
|
||||
|
||||
func (as *impl) GetUserProfile(email string) (*userdomain.UserProfile, error) {
|
||||
user, err := as.userRepo.GetUserProfile(email)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return user, nil
|
||||
}
|
||||
@ -3,7 +3,7 @@ package authsvc
|
||||
import (
|
||||
staffrepository "legalgo-BE-go/internal/accessor/staff"
|
||||
subscriberepository "legalgo-BE-go/internal/accessor/subscribe"
|
||||
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribeplan"
|
||||
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribe_plan"
|
||||
userrepository "legalgo-BE-go/internal/accessor/user"
|
||||
staffdomain "legalgo-BE-go/internal/domain/staff"
|
||||
userdomain "legalgo-BE-go/internal/domain/user"
|
||||
@ -12,8 +12,8 @@ import (
|
||||
type impl struct {
|
||||
staffRepo staffrepository.Staff
|
||||
userRepo userrepository.User
|
||||
subsRepo subscriberepository.SubsIntf
|
||||
subsPlanRepo subscribeplanrepository.SubsPlanIntf
|
||||
subsRepo subscriberepository.Subscribe
|
||||
subsPlanRepo subscribeplanrepository.SubscribePlan
|
||||
}
|
||||
|
||||
type Auth interface {
|
||||
@ -22,17 +22,13 @@ type Auth interface {
|
||||
GetStaffProfile(string) (*staffdomain.StaffProfile, error)
|
||||
GetUsers() ([]userdomain.UserProfile, error)
|
||||
UpdateStaff(staffdomain.Staff) error
|
||||
|
||||
LoginAsUser(userdomain.UserLogin) (string, error)
|
||||
RegisterUser(userdomain.UserRegister) (string, error)
|
||||
GetUserProfile(string) (*userdomain.UserProfile, error)
|
||||
}
|
||||
|
||||
func New(
|
||||
staffRepo staffrepository.Staff,
|
||||
userRepo userrepository.User,
|
||||
subsRepo subscriberepository.SubsIntf,
|
||||
subsPlanRepo subscribeplanrepository.SubsPlanIntf,
|
||||
subsRepo subscriberepository.Subscribe,
|
||||
subsPlanRepo subscribeplanrepository.SubscribePlan,
|
||||
) Auth {
|
||||
return &impl{
|
||||
staffRepo: staffRepo,
|
||||
|
||||
@ -16,7 +16,7 @@ func (sv *impl) LoginAsStaff(spec staffdomain.StaffLogin) (string, error) {
|
||||
return "", errors.New(err.Error())
|
||||
}
|
||||
|
||||
matchPassword := ComparePassword(staff.Password, spec.Password)
|
||||
matchPassword := utils.ComparePassword(staff.Password, spec.Password)
|
||||
if !matchPassword {
|
||||
return "", errors.New("wrong password")
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@ func (a *impl) RegisterStaff(spec staffdomain.StaffRegister) (string, error) {
|
||||
if err == nil {
|
||||
return "", errors.New("this email address is already in use")
|
||||
}
|
||||
hashedPwd, err := HashPassword(spec.Password)
|
||||
hashedPwd, err := utils.HashPassword(spec.Password)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
adssvc "legalgo-BE-go/internal/services/ads"
|
||||
serviceauth "legalgo-BE-go/internal/services/auth"
|
||||
categorysvc "legalgo-BE-go/internal/services/category"
|
||||
newssvc "legalgo-BE-go/internal/services/news"
|
||||
@ -8,6 +9,7 @@ import (
|
||||
subscribesvc "legalgo-BE-go/internal/services/subscribe"
|
||||
subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan"
|
||||
tagsvc "legalgo-BE-go/internal/services/tag"
|
||||
usersvc "legalgo-BE-go/internal/services/user"
|
||||
|
||||
"go.uber.org/fx"
|
||||
)
|
||||
@ -21,5 +23,7 @@ var Module = fx.Module("services",
|
||||
categorysvc.New,
|
||||
newssvc.New,
|
||||
oss.NewOSSService,
|
||||
usersvc.New,
|
||||
adssvc.New,
|
||||
),
|
||||
)
|
||||
|
||||
@ -6,14 +6,14 @@ import (
|
||||
)
|
||||
|
||||
type impl struct {
|
||||
subsRepo subscriberepository.SubsIntf
|
||||
subsRepo subscriberepository.Subscribe
|
||||
}
|
||||
|
||||
type Subscribe interface {
|
||||
Create(string) (string, error)
|
||||
Update(string, userdomain.UserSubsUpdate) error
|
||||
Update(userdomain.UserSubsUpdate) error
|
||||
}
|
||||
|
||||
func New(subsRepo subscriberepository.SubsIntf) Subscribe {
|
||||
func New(subsRepo subscriberepository.Subscribe) Subscribe {
|
||||
return &impl{subsRepo}
|
||||
}
|
||||
|
||||
@ -1,9 +1,20 @@
|
||||
package subscribesvc
|
||||
|
||||
import (
|
||||
subscribedomain "legalgo-BE-go/internal/domain/subscribe"
|
||||
userdomain "legalgo-BE-go/internal/domain/user"
|
||||
timeutils "legalgo-BE-go/internal/utilities/time_utils"
|
||||
)
|
||||
|
||||
func (i *impl) Update(id string, spec userdomain.UserSubsUpdate) error {
|
||||
return nil
|
||||
func (i *impl) Update(spec userdomain.UserSubsUpdate) error {
|
||||
newSpec := subscribedomain.Subscribe{
|
||||
ID: spec.ID,
|
||||
AutoRenew: spec.AutoRenew,
|
||||
StartDate: timeutils.Now(),
|
||||
EndDate: spec.EndDate,
|
||||
Status: spec.Status,
|
||||
SubscribePlanID: spec.SubscribePlanID,
|
||||
UpdatedAt: timeutils.Now(),
|
||||
}
|
||||
return i.subsRepo.Update(newSpec)
|
||||
}
|
||||
|
||||
16
internal/services/subscribe_plan/create.go
Normal file
16
internal/services/subscribe_plan/create.go
Normal file
@ -0,0 +1,16 @@
|
||||
package subscribeplansvc
|
||||
|
||||
import (
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func (sb *impl) Create(spec subscribeplandomain.SubscribePlanReq) error {
|
||||
data := subscribeplandomain.SubscribePlan{
|
||||
ID: uuid.NewString(),
|
||||
Code: spec.Code,
|
||||
Name: spec.Name,
|
||||
}
|
||||
return sb.subsRepo.Create(data)
|
||||
}
|
||||
@ -1,7 +0,0 @@
|
||||
package subscribeplansvc
|
||||
|
||||
import subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
|
||||
func (sb *impl) CreatePlan(spec subscribeplandomain.SubscribePlanReq) error {
|
||||
return sb.subsAccs.Create(spec)
|
||||
}
|
||||
5
internal/services/subscribe_plan/delete.go
Normal file
5
internal/services/subscribe_plan/delete.go
Normal file
@ -0,0 +1,5 @@
|
||||
package subscribeplansvc
|
||||
|
||||
func (i *impl) Delete(id string) error {
|
||||
return i.subsRepo.Delete(id)
|
||||
}
|
||||
@ -5,5 +5,5 @@ import (
|
||||
)
|
||||
|
||||
func (s *impl) GetAllPlan() ([]subscribeplandomain.SubscribePlan, error) {
|
||||
return s.subsAccs.GetAll()
|
||||
return s.subsRepo.GetAll()
|
||||
}
|
||||
@ -1,21 +1,23 @@
|
||||
package subscribeplansvc
|
||||
|
||||
import (
|
||||
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribeplan"
|
||||
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribe_plan"
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
)
|
||||
|
||||
type impl struct {
|
||||
subsAccs subscribeplanrepository.SubsPlanIntf
|
||||
subsRepo subscribeplanrepository.SubscribePlan
|
||||
}
|
||||
|
||||
type SubscribePlan interface {
|
||||
CreatePlan(subscribeplandomain.SubscribePlanReq) error
|
||||
Create(subscribeplandomain.SubscribePlanReq) error
|
||||
Update(string, subscribeplandomain.SubscribePlanUpdate) error
|
||||
GetAllPlan() ([]subscribeplandomain.SubscribePlan, error)
|
||||
Delete(string) error
|
||||
}
|
||||
|
||||
func New(
|
||||
subsAccs subscribeplanrepository.SubsPlanIntf,
|
||||
subsAccs subscribeplanrepository.SubscribePlan,
|
||||
) SubscribePlan {
|
||||
return &impl{subsAccs}
|
||||
}
|
||||
|
||||
16
internal/services/subscribe_plan/update.go
Normal file
16
internal/services/subscribe_plan/update.go
Normal file
@ -0,0 +1,16 @@
|
||||
package subscribeplansvc
|
||||
|
||||
import (
|
||||
subscribeplandomain "legalgo-BE-go/internal/domain/subscribe_plan"
|
||||
timeutils "legalgo-BE-go/internal/utilities/time_utils"
|
||||
)
|
||||
|
||||
func (i *impl) Update(id string, spec subscribeplandomain.SubscribePlanUpdate) error {
|
||||
newData := subscribeplandomain.SubscribePlan{
|
||||
ID: id,
|
||||
Code: spec.Code,
|
||||
Name: spec.Name,
|
||||
UpdatedAt: timeutils.Now(),
|
||||
}
|
||||
return i.subsRepo.Update(newData)
|
||||
}
|
||||
@ -1,9 +0,0 @@
|
||||
package tagsvc
|
||||
|
||||
import (
|
||||
tagdomain "legalgo-BE-go/internal/domain/tag"
|
||||
)
|
||||
|
||||
func (i *impl) GetAllModel() ([]tagdomain.Tag, error) {
|
||||
return i.tagRepo.GetAll()
|
||||
}
|
||||
@ -12,7 +12,6 @@ type impl struct {
|
||||
type Tag interface {
|
||||
Create(tagdomain.TagReq) error
|
||||
GetAll() ([]tagdomain.Tag, error)
|
||||
GetAllModel() ([]tagdomain.Tag, error)
|
||||
Update(string, tagdomain.TagReq) error
|
||||
Delete(string) error
|
||||
}
|
||||
|
||||
14
internal/services/user/get_user.go
Normal file
14
internal/services/user/get_user.go
Normal file
@ -0,0 +1,14 @@
|
||||
package usersvc
|
||||
|
||||
import (
|
||||
userdomain "legalgo-BE-go/internal/domain/user"
|
||||
)
|
||||
|
||||
func (i *impl) GetUserProfile(email string) (*userdomain.UserProfile, error) {
|
||||
user, err := i.userRepo.GetUserProfile(email)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return user, nil
|
||||
}
|
||||
32
internal/services/user/impl.go
Normal file
32
internal/services/user/impl.go
Normal file
@ -0,0 +1,32 @@
|
||||
package usersvc
|
||||
|
||||
import (
|
||||
subscriberepository "legalgo-BE-go/internal/accessor/subscribe"
|
||||
subscribeplanrepository "legalgo-BE-go/internal/accessor/subscribe_plan"
|
||||
userrepository "legalgo-BE-go/internal/accessor/user"
|
||||
userdomain "legalgo-BE-go/internal/domain/user"
|
||||
)
|
||||
|
||||
type impl struct {
|
||||
subsRepo subscriberepository.Subscribe
|
||||
userRepo userrepository.User
|
||||
subsPlanRepo subscribeplanrepository.SubscribePlan
|
||||
}
|
||||
|
||||
type User interface {
|
||||
GetUserProfile(string) (*userdomain.UserProfile, error)
|
||||
LoginAsUser(userdomain.UserLogin) (string, error)
|
||||
RegisterUser(userdomain.UserRegister) (string, error)
|
||||
}
|
||||
|
||||
func New(
|
||||
subsRepo subscriberepository.Subscribe,
|
||||
userRepo userrepository.User,
|
||||
subsPlanRepo subscribeplanrepository.SubscribePlan,
|
||||
) User {
|
||||
return &impl{
|
||||
subsRepo,
|
||||
userRepo,
|
||||
subsPlanRepo,
|
||||
}
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package authsvc
|
||||
package usersvc
|
||||
|
||||
import (
|
||||
"errors"
|
||||
@ -10,13 +10,13 @@ import (
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func (a *impl) LoginAsUser(spec userdomain.UserLogin) (string, error) {
|
||||
user, err := a.userRepo.GetUserByEmail(spec.Email)
|
||||
func (i *impl) LoginAsUser(spec userdomain.UserLogin) (string, error) {
|
||||
user, err := i.userRepo.GetUserByEmail(spec.Email)
|
||||
if err != nil {
|
||||
return "", errors.New(err.Error())
|
||||
}
|
||||
|
||||
matchPassword := ComparePassword(user.Password, spec.Password)
|
||||
matchPassword := utils.ComparePassword(user.Password, spec.Password)
|
||||
if !matchPassword {
|
||||
return "", errors.New("wrong password")
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package authsvc
|
||||
package usersvc
|
||||
|
||||
import (
|
||||
"errors"
|
||||
@ -10,15 +10,15 @@ import (
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
func (a *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
|
||||
_, err := a.userRepo.GetUserByEmail(spec.Email)
|
||||
func (i *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
|
||||
_, err := i.userRepo.GetUserByEmail(spec.Email)
|
||||
|
||||
if err == nil {
|
||||
return "", errors.New("this email address is already in use")
|
||||
}
|
||||
|
||||
if spec.SubscribePlanID == "" {
|
||||
subsPlan, err := a.subsPlanRepo.GetDefault()
|
||||
subsPlan, err := i.subsPlanRepo.GetDefault()
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@ -26,17 +26,17 @@ func (a *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
|
||||
spec.SubscribePlanID = subsPlan.ID
|
||||
}
|
||||
|
||||
_, err = a.subsPlanRepo.GetByID(spec.SubscribePlanID)
|
||||
_, err = i.subsPlanRepo.GetByID(spec.SubscribePlanID)
|
||||
if err != nil {
|
||||
return "", errors.New(err.Error())
|
||||
}
|
||||
|
||||
subsId, err := a.subsRepo.Create(spec.SubscribePlanID)
|
||||
subsId, err := i.subsRepo.Create(spec.SubscribePlanID)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
hashedPwd, err := HashPassword(spec.Password)
|
||||
hashedPwd, err := utils.HashPassword(spec.Password)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
@ -49,7 +49,7 @@ func (a *impl) RegisterUser(spec userdomain.UserRegister) (string, error) {
|
||||
Phone: spec.Phone,
|
||||
}
|
||||
|
||||
err = a.userRepo.CreateUser(user)
|
||||
err = i.userRepo.CreateUser(user)
|
||||
if err != nil {
|
||||
return "", errors.New(err.Error())
|
||||
}
|
||||
@ -1,4 +1,4 @@
|
||||
package authsvc
|
||||
package utils
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
Loading…
x
Reference in New Issue
Block a user