26 Commits
Author SHA1 Message Date
Ardeman 211f0154be fix: update default environment mode to local and adjust database configurations 2025-04-24 11:25:36 +08:00
Ardeman 136c4634c8 fix: enable SSL for Redis configuration in debug environment 2025-04-23 19:10:31 +08:00
Ardeman 987ac2fe4a fix: update Redis configuration to use SSL and adjust related settings 2025-04-23 19:09:24 +08:00
Ardeman 02d8a509ff fix: update Redis credentials in staging configuration 2025-04-23 18:45:49 +08:00
Ardeman e29bd7986f fix: update default environment mode to staging and add local configuration file 2025-04-23 18:18:44 +08:00
Ardeman 4bf318a9c2 fix: update PostgreSQL configuration for staging environment 2025-04-23 18:01:55 +08:00
Ardeman 52085a5be0 feat: add staging configuration file with server, database, and OSS settings 2025-04-23 17:52:58 +08:00
Ardeman 21c4c1efba fix: update MinIO endpoint and URLs to use news-cdn.legalgo.id in debug.yaml and production.yaml 2025-04-23 14:50:59 +08:00
Ardeman c17540cc20 fix: update MinIO endpoint and URLs to use crm-cdn.legalgo.id in production.yaml 2025-04-23 14:27:26 +08:00
Ardeman 714b1ff4eb fix: correct public URL formatting in GetPublicURL function 2025-04-23 13:50:41 +08:00
Ardeman abc3ce8d2b fix: update bucket name to 'uploads' in debug.yaml and production.yaml 2025-04-23 13:48:28 +08:00
Ardeman cd1097d3d0 fix: update MinIO endpoint to include the full domain in debug.yaml and production.yaml 2025-04-23 13:39:43 +08:00
Ardeman 52991059c6 fix: update bucket name to legalgonews-production in debug.yaml and production.yaml 2025-04-23 13:17:32 +08:00
Ardeman a7ef3f8ca2 fix: update SSL mode configuration in debug.yaml and NewDB function 2025-04-23 13:11:57 +08:00
Ardeman 6f1ac37915 fix: update redis host configuration in production.yaml 2025-04-23 12:57:06 +08:00
Ardeman e20c63e694 feat: add debug configuration file for server, jwt, postgresql, oss, and redis 2025-04-23 12:50:28 +08:00
Ardeman abcbc014a2 feat: add production configuration files for server, jwt, postgresql, oss, and redis 2025-04-23 12:39:50 +08:00
ericprd 98b871a5ed feat: get all staff 2025-03-25 18:01:14 +08:00
ericprd 3311b80943 Merge branch 'main' of github.com:ardeman/project-legalgo-go 2025-03-24 22:16:17 +08:00
ericprd 16fef8706a fix: register staff return message only 2025-03-24 22:15:41 +08:00
Ardeman 4fbfa9c2c9 Merge branch 'main' of https://github.com/ardeman/project-legalgo-go
* 'main' of https://github.com/ardeman/project-legalgo-go:
  fix: search news title by query
2025-03-24 18:18:53 +08:00
ericprd a68780f09e fix: search news title by query 2025-03-24 18:11:08 +08:00
Ardeman 49dc0e4a7b refactor: update GetAll method to return NewsResponse and rename clicked to views 2025-03-24 15:24:52 +08:00
ericprd 09d9c4efb8 fix: error clicked when create new news 2025-03-24 14:02:20 +08:00
ericprd 990026cece fix: error clicked when create new news 2025-03-24 13:35:46 +08:00
ericprd 11051ae89c feat: staff get news by id 2025-03-24 13:32:05 +08:00
37 changed files with 385 additions and 60 deletions
+5 -4
View File
@@ -12,14 +12,15 @@ import (
const ( const (
YAML_PATH = "env/%s" YAML_PATH = "env/%s"
ENV_MODE = "ENV_MODE" ENV_MODE = "ENV_MODE"
DEFAULT_ENV_MODE = "development" DEFAULT_ENV_MODE = "local"
) )
var ( var (
validEnvMode = map[string]struct{}{ validEnvMode = map[string]struct{}{
"local": {}, "local": {},
"development": {}, "staging": {},
"production": {}, "production": {},
"debug": {},
} }
) )
+1 -1
View File
@@ -6,7 +6,7 @@ type Redis struct {
DB int `mapstructure:"db"` DB int `mapstructure:"db"`
Username string `mapstructure:"username"` Username string `mapstructure:"username"`
Password string `mapstructure:"password"` Password string `mapstructure:"password"`
SslMode string `mapstructure:"ssl-mode"` SSL bool `mapstructure:"ssl"`
Debug bool `mapstructure:"debug"` Debug bool `mapstructure:"debug"`
MaxIdleConnectionsInSecond int `mapstructure:"max-idle-connections-in-second"` MaxIdleConnectionsInSecond int `mapstructure:"max-idle-connections-in-second"`
MaxOpenConnectionsInSecond int `mapstructure:"max-open-connections-in-second"` MaxOpenConnectionsInSecond int `mapstructure:"max-open-connections-in-second"`
+2 -1
View File
@@ -15,12 +15,13 @@ type DB struct {
func NewDB(cfg *config.Config) (*DB, error) { func NewDB(cfg *config.Config) (*DB, error) {
dsn := fmt.Sprintf( dsn := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%v sslmode=disable", "host=%s user=%s password=%s dbname=%s port=%v sslmode=%s",
cfg.Database.Host, cfg.Database.Host,
cfg.Database.Username, cfg.Database.Username,
cfg.Database.Password, cfg.Database.Password,
cfg.Database.DB, cfg.Database.DB,
cfg.Database.Port, cfg.Database.Port,
cfg.Database.SslMode,
) )
if dsn == "" { if dsn == "" {
+43
View File
@@ -0,0 +1,43 @@
server:
base-url: https://api.legalgo.id/core
local-url: http://localhost:3300
port: 3300
jwt:
token:
expires-ttl: 1440
secret: "5Lm25V3Qd7aut8dr4QUxm5PZUrSFs"
postgresql:
host: dpg-d046h549c44c739arfv0-a.singapore-postgres.render.com
port: 5432
driver: postgres
db: legalgonews_prod
username: legalgo_admin
password: "656ogwc0JlLEVQyHnT5RrrYa7762iBQQ"
ssl-mode: require
max-idle-connections-in-second: 600
max-open-connections-in-second: 600
connection-max-life-time-in-second: 600
debug: false
oss:
access_key_id: GTK7i3SVy9llQeGH0Htv
access_key_secret: 2psmKXZFpevA9n5ntSDRMqFBpZuSz32dvtXjYclf
endpoint: news-cdn.legalgo.id
bucket_name: uploads
log_level: Error
host_url: https://news-cdn.legalgo.id
public_url: https://news-cdn.legalgo.id
redis:
host: singapore-keyvalue.render.com
port: 6379
username: red-d046l42dbo4c73ea9iag
password: 7cZvu08JKuO9MPNxBb97tZCVNj0ZGNp2
db: 5
ssl: true
max-idle-connections-in-second: 600
max-open-connections-in-second: 600
connection-max-life-time-in-second: 600
debug: false
+43
View File
@@ -0,0 +1,43 @@
server:
base-url: https://api.legalgo.id/core
local-url: http://localhost:3300
port: 3300
jwt:
token:
expires-ttl: 1440
secret: "5Lm25V3Qd7aut8dr4QUxm5PZUrSFs"
postgresql:
host: dpg-d04bi9juibrs73augcc0-a.singapore-postgres.render.com
port: 5432
driver: postgres
db: legalgonews_dev
username: legalgo_admin
password: "5h7DCBR1T8pug6AlbrHXqIDAr9o2vnky"
ssl-mode: require
max-idle-connections-in-second: 600
max-open-connections-in-second: 600
connection-max-life-time-in-second: 600
debug: false
oss:
access_key_id: GTK7i3SVy9llQeGH0Htv
access_key_secret: 2psmKXZFpevA9n5ntSDRMqFBpZuSz32dvtXjYclf
endpoint: news-cdn.legalgo.id
bucket_name: uploads-staging
log_level: Error
host_url: https://news-cdn.legalgo.id
public_url: https://news-cdn.legalgo.id
redis:
host: singapore-keyvalue.render.com
port: 6379
username: red-d04c8k49c44c739ga8dg
password: ItPzniHv94yr8vY4HTrhCfKoibqBh61T
db: 5
ssl: true
max-idle-connections-in-second: 600
max-open-connections-in-second: 600
connection-max-life-time-in-second: 600
debug: false
+13 -13
View File
@@ -9,12 +9,12 @@ jwt:
secret: "5Lm25V3Qd7aut8dr4QUxm5PZUrSFs" secret: "5Lm25V3Qd7aut8dr4QUxm5PZUrSFs"
postgresql: postgresql:
host: 62.72.45.250 host: dpg-d046h549c44c739arfv0-a
port: 20826 port: 5432
driver: postgres driver: postgres
db: legalgonews-dev db: legalgonews_prod
username: legalgo_admin username: legalgo_admin
password: "K4K!2Kg7c@KW6H&4A2aBy2dFCRY3Sh" password: "656ogwc0JlLEVQyHnT5RrrYa7762iBQQ"
ssl-mode: disable ssl-mode: disable
max-idle-connections-in-second: 600 max-idle-connections-in-second: 600
max-open-connections-in-second: 600 max-open-connections-in-second: 600
@@ -22,18 +22,18 @@ postgresql:
debug: false debug: false
oss: oss:
access_key_id: cf9a475e18bc7626cbdbf09709d82a64 access_key_id: GTK7i3SVy9llQeGH0Htv
access_key_secret: 91f3321294d3e23035427a0ecb893ada access_key_secret: 2psmKXZFpevA9n5ntSDRMqFBpZuSz32dvtXjYclf
endpoint: sin1.contabostorage.com endpoint: news-cdn.legalgo.id
bucket_name: legalgonews-dev bucket_name: uploads
log_level: Error log_level: Error
host_url: https://sin1.contabostorage.com host_url: https://news-cdn.legalgo.id
public_url: https://sin1.contabostorage.com/fda98c2228f246f29a7e466b86b3b9e7 public_url: https://news-cdn.legalgo.id
redis: redis:
host: 62.72.45.250 host: red-d046l42dbo4c73ea9iag
port: 26379 port: 6379
password: mDtpsyEW8W26vwLhglpO password: 7cZvu08JKuO9MPNxBb97tZCVNj0ZGNp2
db: 5 db: 5
ssl: false ssl: false
max-idle-connections-in-second: 600 max-idle-connections-in-second: 600
+42
View File
@@ -0,0 +1,42 @@
server:
base-url: https://api.legalgo.id/core
local-url: http://localhost:3300
port: 3300
jwt:
token:
expires-ttl: 1440
secret: "5Lm25V3Qd7aut8dr4QUxm5PZUrSFs"
postgresql:
host: dpg-d04bi9juibrs73augcc0-a
port: 5432
driver: postgres
db: legalgonews_dev
username: legalgo_admin
password: "5h7DCBR1T8pug6AlbrHXqIDAr9o2vnky"
ssl-mode: disable
max-idle-connections-in-second: 600
max-open-connections-in-second: 600
connection-max-life-time-in-second: 600
debug: false
oss:
access_key_id: GTK7i3SVy9llQeGH0Htv
access_key_secret: 2psmKXZFpevA9n5ntSDRMqFBpZuSz32dvtXjYclf
endpoint: news-cdn.legalgo.id
bucket_name: uploads-staging
log_level: Error
host_url: https://news-cdn.legalgo.id
public_url: https://news-cdn.legalgo.id
redis:
host: red-d04c8k49c44c739ga8dg
port: 6379
password: ItPzniHv94yr8vY4HTrhCfKoibqBh61T
db: 5
ssl: false
max-idle-connections-in-second: 600
max-open-connections-in-second: 600
connection-max-life-time-in-second: 600
debug: false
+8 -4
View File
@@ -12,9 +12,9 @@ const (
notActive is_active = "false" notActive is_active = "false"
) )
func (a *accessor) GetAll(filter newsdomain.NewsFilter) ([]newsdomain.News, error) { func (a *accessor) GetAll(filter newsdomain.NewsFilter) ([]newsdomain.NewsResponse, error) {
var news []newsdomain.News var news []newsdomain.NewsResponse
query := a.db. query := a.db.Table("news").
Preload("Tags"). Preload("Tags").
Preload("Categories"). Preload("Categories").
Preload("Author"). Preload("Author").
@@ -34,8 +34,12 @@ func (a *accessor) GetAll(filter newsdomain.NewsFilter) ([]newsdomain.News, erro
query = query.Where("news.live_at <= ?", timeutils.Now()) query = query.Where("news.live_at <= ?", timeutils.Now())
} }
if filter.Search != "" {
query = query.Where("news.title ILIKE ?", "%"+filter.Search+"%")
}
query. query.
Select("news.*, COUNT(content_logs.content_id) as clicked"). Select("news.*, COUNT(content_logs.content_id) as views").
Group("news.id"). Group("news.id").
Order("news.created_at DESC") Order("news.created_at DESC")
+17
View File
@@ -0,0 +1,17 @@
package newsrepository
import newsdomain "legalgo-BE-go/internal/domain/news"
func (a *accessor) GetByID(id string) (*newsdomain.News, error) {
var news newsdomain.News
if err := a.db.
Preload("Tags").
Preload("Categories").
Preload("Author").
First(&news, "id = ?", id).Error; err != nil {
return nil, err
}
return &news, nil
}
+2 -1
View File
@@ -10,8 +10,9 @@ type accessor struct {
} }
type News interface { type News interface {
GetAll(filter newsdomain.NewsFilter) ([]newsdomain.News, error) GetAll(filter newsdomain.NewsFilter) ([]newsdomain.NewsResponse, error)
GetBySlug(string) (*newsdomain.News, error) GetBySlug(string) (*newsdomain.News, error)
GetByID(string) (*newsdomain.News, error)
Create(newsdomain.News) error Create(newsdomain.News) error
Update(newsdomain.News) error Update(newsdomain.News) error
Delete(string) error Delete(string) error
+1 -1
View File
@@ -66,7 +66,7 @@ func (r *OssRepositoryImpl) GetPublicURL(fileName string) string {
if fileName == "" { if fileName == "" {
return "" return ""
} }
return fmt.Sprintf("%s:%s%s", r.cfg.GetPublicURL(), r.cfg.GetBucketName(), fileName) return fmt.Sprintf("%s/%s%s", r.cfg.GetPublicURL(), r.cfg.GetBucketName(), fileName)
} }
func (r *OssRepositoryImpl) DeleteObject(ctx context.Context, fileName string) error { func (r *OssRepositoryImpl) DeleteObject(ctx context.Context, fileName string) error {
+11 -2
View File
@@ -1,6 +1,7 @@
package redisaccessor package redisaccessor
import ( import (
"crypto/tls"
"fmt" "fmt"
"legalgo-BE-go/config" "legalgo-BE-go/config"
@@ -16,11 +17,19 @@ func Get() *redis.Client {
func New(cfg *config.Config) *redis.Client { func New(cfg *config.Config) *redis.Client {
addr := fmt.Sprintf("%s:%s", cfg.Redis.Host, cfg.Redis.Port) addr := fmt.Sprintf("%s:%s", cfg.Redis.Host, cfg.Redis.Port)
redisClient = redis.NewClient(&redis.Options{ options := &redis.Options{
Addr: addr, Addr: addr,
Password: cfg.Redis.Password, Password: cfg.Redis.Password,
DB: cfg.Redis.DB, DB: cfg.Redis.DB,
}) }
if cfg.Redis.Username != "" {
options.Username = cfg.Redis.Username
}
if cfg.Redis.SSL {
options.TLSConfig = &tls.Config{}
}
redisClient = redis.NewClient(options)
return redisClient return redisClient
} }
+13
View File
@@ -0,0 +1,13 @@
package staffrepository
import staffdomain "legalgo-BE-go/internal/domain/staff"
func (a *accessor) GetStaffs() ([]staffdomain.StaffProfile, error) {
var staffs []staffdomain.StaffProfile
if err := a.db.Table("staffs").Find(&staffs).Error; err != nil {
return staffs, err
}
return staffs, nil
}
+1
View File
@@ -14,6 +14,7 @@ type Staff interface {
GetStaffByEmail(string) (*staffdomain.Staff, error) GetStaffByEmail(string) (*staffdomain.Staff, error)
GetStaffByID(string) (*staffdomain.Staff, error) GetStaffByID(string) (*staffdomain.Staff, error)
GetUsers() ([]userdomain.UserProfile, error) GetUsers() ([]userdomain.UserProfile, error)
GetStaffs() ([]staffdomain.StaffProfile, error)
Create(staffdomain.Staff) error Create(staffdomain.Staff) error
Update(staffdomain.Staff) error Update(staffdomain.Staff) error
} }
+3 -1
View File
@@ -15,7 +15,7 @@ func GetAll(
) { ) {
router.Get("/news", func(w http.ResponseWriter, r *http.Request) { router.Get("/news", func(w http.ResponseWriter, r *http.Request) {
var ( var (
news []newsdomain.News news []newsdomain.NewsResponse
err error err error
) )
ctx := r.Context() ctx := r.Context()
@@ -24,11 +24,13 @@ func GetAll(
category := query.Get("categories") category := query.Get("categories")
tags := query.Get("tags") tags := query.Get("tags")
activeOnly := query.Get("active") activeOnly := query.Get("active")
search := query.Get("q")
news, err = newsSvc.GetAll(newsdomain.Filter{ news, err = newsSvc.GetAll(newsdomain.Filter{
Category: category, Category: category,
Tags: tags, Tags: tags,
Active: activeOnly, Active: activeOnly,
Search: search,
}) })
if err != nil { if err != nil {
+77
View File
@@ -0,0 +1,77 @@
package newshttp
import (
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
logssvc "legalgo-BE-go/internal/services/logs"
newssvc "legalgo-BE-go/internal/services/news"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
"net/http"
"github.com/go-chi/chi/v5"
)
func GetByID(
router chi.Router,
newsSvc newssvc.News,
logSvc logssvc.Log,
) {
router.With(authmiddleware.Authorize()).Get("/staff/news/{id}", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
id := chi.URLParam(r, "id")
token, err := utils.GetToken(r)
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
staffDetail, err := utils.DestructToken(token)
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
if staffDetail.Role != "staff" {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrUnauthorized.Code,
response.ErrUnauthorized.HttpCode,
"unauthorized",
)
return
}
news, err := newsSvc.GetByID(id)
if err != nil {
response.ResponseWithErrorCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
response.RespondJsonSuccess(ctx, w, news)
})
}
+1
View File
@@ -5,6 +5,7 @@ import "go.uber.org/fx"
var Module = fx.Module("news", fx.Invoke( var Module = fx.Module("news", fx.Invoke(
GetAll, GetAll,
GetBySlug, GetBySlug,
GetByID,
Create, Create,
Update, Update,
Delete, Delete,
+1 -1
View File
@@ -5,7 +5,7 @@ import (
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth" authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
newsdomain "legalgo-BE-go/internal/domain/news" newsdomain "legalgo-BE-go/internal/domain/news"
newssvc "legalgo-BE-go/internal/services/news" newssvc "legalgo-BE-go/internal/services/news"
staffsvc "legalgo-BE-go/internal/services/staffsvc" staffsvc "legalgo-BE-go/internal/services/staff"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
"net/http" "net/http"
+59
View File
@@ -0,0 +1,59 @@
package staffhttp
import (
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
staffsvc "legalgo-BE-go/internal/services/staff"
"legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils"
"net/http"
"github.com/go-chi/chi/v5"
)
func GetStaffs(
router chi.Router,
staffSvc staffsvc.Auth,
) {
router.With(authmiddleware.Authorize()).Get("/staff/get-all", func(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
staffDetail, err := utils.GetTokenDetail(r)
if err != nil {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
"failed to get staff token",
)
return
}
if staffDetail.Role != "staff" {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrUnauthorized.Code,
response.ErrUnauthorized.HttpCode,
"unauthorized",
)
return
}
staffs, err := staffSvc.GetStaffs()
if err != nil {
response.RespondJsonErrorWithCode(
ctx,
w,
err,
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
response.RespondJsonSuccess(ctx, w, staffs)
})
}
+1 -1
View File
@@ -2,7 +2,7 @@ package staffhttp
import ( import (
authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth" authmiddleware "legalgo-BE-go/internal/api/http/middleware/auth"
staffsvc "legalgo-BE-go/internal/services/staffsvc" staffsvc "legalgo-BE-go/internal/services/staff"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
"net/http" "net/http"
+1 -1
View File
@@ -5,7 +5,7 @@ import (
responsedomain "legalgo-BE-go/internal/domain/reponse" responsedomain "legalgo-BE-go/internal/domain/reponse"
staffdomain "legalgo-BE-go/internal/domain/staff" staffdomain "legalgo-BE-go/internal/domain/staff"
staffsvc "legalgo-BE-go/internal/services/staffsvc" staffsvc "legalgo-BE-go/internal/services/staff"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
+1
View File
@@ -9,5 +9,6 @@ var Module = fx.Module("auth-api",
Update, Update,
GetProfile, GetProfile,
GetUsers, GetUsers,
GetStaffs,
), ),
) )
+1 -1
View File
@@ -1,7 +1,7 @@
package staffhttp package staffhttp
import ( import (
staffsvc "legalgo-BE-go/internal/services/staffsvc" staffsvc "legalgo-BE-go/internal/services/staff"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
"net/http" "net/http"
+7 -19
View File
@@ -3,9 +3,8 @@ package staffhttp
import ( import (
"net/http" "net/http"
responsedomain "legalgo-BE-go/internal/domain/reponse"
staffdomain "legalgo-BE-go/internal/domain/staff" staffdomain "legalgo-BE-go/internal/domain/staff"
staffsvc "legalgo-BE-go/internal/services/staffsvc" staffsvc "legalgo-BE-go/internal/services/staff"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
@@ -49,7 +48,7 @@ func Register(
return return
} }
token, err := authSvc.Register(spec) _, err := authSvc.Register(spec)
if err != nil { if err != nil {
response.ResponseWithErrorCode( response.ResponseWithErrorCode(
ctx, ctx,
@@ -62,21 +61,10 @@ func Register(
return return
} }
if err := utils.StoreTokenRedis(ctx, rdb, token, spec.Email); err != nil { response.RespondJsonSuccess(ctx, w, struct {
response.ResponseWithErrorCode( Message string
ctx, }{
w, Message: "staff created successfully.",
err, })
response.ErrBadRequest.Code,
response.ErrBadRequest.HttpCode,
err.Error(),
)
return
}
responsePayload := &responsedomain.Auth{
Token: token,
}
response.RespondJsonSuccess(ctx, w, responsePayload)
}) })
} }
+1 -1
View File
@@ -2,7 +2,7 @@ package staffhttp
import ( import (
staffdomain "legalgo-BE-go/internal/domain/staff" staffdomain "legalgo-BE-go/internal/domain/staff"
staffsvc "legalgo-BE-go/internal/services/staffsvc" staffsvc "legalgo-BE-go/internal/services/staff"
"legalgo-BE-go/internal/utilities/response" "legalgo-BE-go/internal/utilities/response"
"legalgo-BE-go/internal/utilities/utils" "legalgo-BE-go/internal/utilities/utils"
"net/http" "net/http"
+9 -4
View File
@@ -27,19 +27,23 @@ type News struct {
Title string `json:"title"` Title string `json:"title"`
Content string `json:"content"` Content string `json:"content"`
FeaturedImage string `json:"featured_image"` FeaturedImage string `json:"featured_image"`
Tags []tagdomain.Tag `gorm:"many2many:news_tags" json:"tags"` Tags []tagdomain.Tag `gorm:"many2many:news_tags;foreignKey:ID;joinForeignKey:news_id;References:ID;joinReferences:tag_id" json:"tags"`
Categories []categorydomain.Category `gorm:"many2many:news_categories" json:"categories"` Categories []categorydomain.Category `gorm:"many2many:news_categories;foreignKey:ID;joinForeignKey:news_id;References:ID;joinReferences:category_id" json:"categories"`
IsPremium bool `json:"is_premium"` IsPremium bool `json:"is_premium"`
Slug string `json:"slug"` Slug string `json:"slug"`
AuthorID string `json:"author_id"` AuthorID string `json:"author_id"`
LiveAt time.Time `json:"live_at"` LiveAt time.Time `json:"live_at"`
CreatedAt time.Time `json:"created_at"` CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"` UpdatedAt time.Time `json:"updated_at"`
Clicked int64 `json:"clicked"`
Author Staff `json:"author"` Author Staff `json:"author"`
} }
type NewsResponse struct {
News
Views int64 `json:"views"`
}
type NewsUpdate struct { type NewsUpdate struct {
ID string `json:"id"` ID string `json:"id"`
Title string `json:"title"` Title string `json:"title"`
@@ -52,11 +56,12 @@ type NewsUpdate struct {
} }
type Filter struct { type Filter struct {
Category, Tags, Active string Category, Tags, Active, Search string
} }
type NewsFilter struct { type NewsFilter struct {
Tags []string Tags []string
Category []string Category []string
Active string Active string
Search string
} }
+1 -1
View File
@@ -6,7 +6,7 @@ import (
logssvc "legalgo-BE-go/internal/services/logs" logssvc "legalgo-BE-go/internal/services/logs"
newssvc "legalgo-BE-go/internal/services/news" newssvc "legalgo-BE-go/internal/services/news"
"legalgo-BE-go/internal/services/oss" "legalgo-BE-go/internal/services/oss"
staffsvc "legalgo-BE-go/internal/services/staffsvc" staffsvc "legalgo-BE-go/internal/services/staff"
subscribesvc "legalgo-BE-go/internal/services/subscribe" subscribesvc "legalgo-BE-go/internal/services/subscribe"
subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan" subscribeplansvc "legalgo-BE-go/internal/services/subscribe_plan"
tagsvc "legalgo-BE-go/internal/services/tag" tagsvc "legalgo-BE-go/internal/services/tag"
+3 -2
View File
@@ -5,12 +5,12 @@ import (
"strings" "strings"
) )
func (i *impl) GetAll(filter newsdomain.Filter) ([]newsdomain.News, error) { func (i *impl) GetAll(filter newsdomain.Filter) ([]newsdomain.NewsResponse, error) {
var err error var err error
categories := []string{} categories := []string{}
tags := []string{} tags := []string{}
news := []newsdomain.News{} news := []newsdomain.NewsResponse{}
tagCodeArr := strings.Split(filter.Tags, " ") tagCodeArr := strings.Split(filter.Tags, " ")
categoryCodeArr := strings.Split(filter.Category, " ") categoryCodeArr := strings.Split(filter.Category, " ")
@@ -41,6 +41,7 @@ func (i *impl) GetAll(filter newsdomain.Filter) ([]newsdomain.News, error) {
Tags: tags, Tags: tags,
Category: categories, Category: categories,
Active: filter.Active, Active: filter.Active,
Search: filter.Search,
} }
return i.newsRepo.GetAll(filterSpec) return i.newsRepo.GetAll(filterSpec)
} }
+7
View File
@@ -0,0 +1,7 @@
package newssvc
import newsdomain "legalgo-BE-go/internal/domain/news"
func (i *impl) GetByID(id string) (*newsdomain.News, error) {
return i.newsRepo.GetByID(id)
}
+2 -1
View File
@@ -16,8 +16,9 @@ type impl struct {
} }
type News interface { type News interface {
GetAll(filter newsdomain.Filter) ([]newsdomain.News, error) GetAll(filter newsdomain.Filter) ([]newsdomain.NewsResponse, error)
GetBySlug(string) (*newsdomain.News, error) GetBySlug(string) (*newsdomain.News, error)
GetByID(string) (*newsdomain.News, error)
Create(newsdomain.NewsReq, string) error Create(newsdomain.NewsReq, string) error
Update(string, newsdomain.NewsUpdate) error Update(string, newsdomain.NewsUpdate) error
Delete(string) error Delete(string) error
+7
View File
@@ -0,0 +1,7 @@
package staffsvc
import staffdomain "legalgo-BE-go/internal/domain/staff"
func (i *impl) GetStaffs() ([]staffdomain.StaffProfile, error) {
return i.staffRepo.GetStaffs()
}
@@ -20,6 +20,7 @@ type Auth interface {
Login(staffdomain.StaffLogin) (string, error) Login(staffdomain.StaffLogin) (string, error)
Register(staffdomain.StaffRegister) (string, error) Register(staffdomain.StaffRegister) (string, error)
GetProfile(string) (*staffdomain.StaffProfile, error) GetProfile(string) (*staffdomain.StaffProfile, error)
GetStaffs() ([]staffdomain.StaffProfile, error)
GetUsers() ([]userdomain.UserProfile, error) GetUsers() ([]userdomain.UserProfile, error)
Update(string, staffdomain.StaffUpdate) error Update(string, staffdomain.StaffUpdate) error
} }