2024-08-03 14:12:44 +08:00
package storage
import (
2024-09-03 17:18:48 +08:00
"fmt"
2024-08-03 14:12:44 +08:00
v2 "gitea.timerzz.com/kedaya_haitao/common/structs/v2"
"gorm.io/gorm"
"gorm.io/gorm/clause"
)
type ArticleApi interface {
2024-09-11 17:51:59 +08:00
Create ( article * v2 . Article ) error
2024-08-03 17:07:10 +08:00
Upsert ( article v2 . Article ) error
2024-09-04 20:52:22 +08:00
Update ( article v2 . Article , selects ... string ) error
2024-08-31 12:46:18 +08:00
Find ( query * FindArticleQuery ) ( articles [ ] v2 . Article , err error )
2024-09-12 20:23:46 +08:00
List ( query PageListQuery , scopes ... func ( db * gorm . DB ) * gorm . DB ) ( articles [ ] v2 . Article , total int64 , err error )
2024-08-31 12:46:18 +08:00
Get ( query * GetArticleQuery ) ( article v2 . Article , err error )
2024-09-01 17:10:18 +08:00
AutoMigrate ( ) error
2024-08-03 14:12:44 +08:00
}
type articleApi struct {
db * gorm . DB
}
2024-08-27 19:35:21 +08:00
func NewArticleApi ( db * gorm . DB ) ArticleApi {
return & articleApi {
db : db ,
}
}
2024-09-11 17:51:59 +08:00
func ( a * articleApi ) Create ( article * v2 . Article ) error {
return a . db . Create ( article ) . Error
}
2024-08-03 14:12:44 +08:00
// Upsert 插入或者更新商品
func ( a * articleApi ) Upsert ( article v2 . Article ) error {
2024-09-03 17:18:48 +08:00
return a . db . Transaction ( func ( tx * gorm . DB ) error {
if err := tx . Clauses ( clause . OnConflict {
Columns : [ ] clause . Column { { Name : "pid" } , { Name : "brand" } } ,
2024-09-11 17:54:18 +08:00
DoUpdates : clause . AssignmentColumns ( [ ] string { "available" , "updated_at" , "cost_price" , "sell_price" , "rate" , "remark" , "exclude" } ) ,
2024-09-03 17:18:48 +08:00
} ) . Create ( & article ) . Error ; err != nil {
return err
}
2024-09-03 17:32:40 +08:00
if len ( article . Providers ) > 0 {
if err := tx . Save ( & article . Providers ) . Error ; err != nil {
return fmt . Errorf ( "failed to save providers: %v" , err )
}
2024-09-03 17:18:48 +08:00
}
2024-09-03 17:32:40 +08:00
if len ( article . Sellers ) > 0 {
return tx . Save ( & article . Sellers ) . Error
}
return nil
2024-09-03 17:18:48 +08:00
} )
2024-08-03 14:12:44 +08:00
}
2024-08-03 17:07:10 +08:00
2024-09-04 20:52:22 +08:00
func ( a * articleApi ) Update ( article v2 . Article , selects ... string ) error {
2024-09-06 11:19:59 +08:00
if len ( selects ) == 0 {
selects = [ ] string { "Remark" , "Exclude" }
2024-09-04 20:52:22 +08:00
}
2024-09-06 11:19:59 +08:00
return a . db . Model ( & article ) . Select ( selects ) . Omit ( clause . Associations ) . Updates ( article ) . Error
2024-09-04 20:52:22 +08:00
}
2024-08-31 12:39:40 +08:00
// ******************Find和List
2024-08-03 17:07:10 +08:00
type FindArticleQuery struct {
2024-08-31 12:39:40 +08:00
ID uint ` query:"id" `
Keyword string ` query:"keyword" `
Brand v2 . Brand ` query:"brand" `
Pid string ` query:"pid" `
2024-09-12 17:36:06 +08:00
Available * bool ` query:"available" ` //可购买
RateSort string ` query:"rate_sort,omitempty" ` // 收益率排序
2024-08-31 12:39:40 +08:00
}
func NewFindArticleQuery ( ) * FindArticleQuery {
return & FindArticleQuery { }
}
func ( f * FindArticleQuery ) SetID ( id uint ) * FindArticleQuery {
f . ID = id
return f
}
func ( f * FindArticleQuery ) SetKeyword ( keyword string ) * FindArticleQuery {
f . Keyword = keyword
return f
}
func ( f * FindArticleQuery ) SetBrand ( brand v2 . Brand ) * FindArticleQuery {
f . Brand = brand
return f
}
func ( f * FindArticleQuery ) SetPid ( pid string ) * FindArticleQuery {
f . Pid = pid
return f
}
func ( f * FindArticleQuery ) SetAvailable ( available bool ) * FindArticleQuery {
f . Available = & available
return f
2024-08-03 17:07:10 +08:00
}
2024-09-12 17:36:06 +08:00
func ( f * FindArticleQuery ) Scope ( db * gorm . DB ) * gorm . DB {
if f . ID != 0 {
db = db . Where ( "id=?" , f . ID )
2024-08-03 17:07:10 +08:00
}
2024-09-12 17:36:06 +08:00
if f . Keyword != "" {
db = db . Where ( "(name ilike ? OR english_name ilike ? OR remark ilike ? OR pid ilike ?)" , "%" + f . Keyword + "%" , "%" + f . Keyword + "%" , "%" + f . Keyword + "%" , "%" + f . Keyword + "%" )
2024-08-03 17:07:10 +08:00
}
2024-09-12 17:36:06 +08:00
if f . Brand != "" {
db = db . Where ( "brand=?" , f . Brand )
2024-08-03 17:07:10 +08:00
}
2024-09-12 17:36:06 +08:00
if f . Pid != "" {
db = db . Where ( "pid=?" , f . Pid )
2024-08-03 17:07:10 +08:00
}
2024-09-12 17:36:06 +08:00
if f . Available != nil {
db = db . Where ( "available=?" , * f . Available )
}
2024-09-12 20:23:46 +08:00
return db
}
func ( f * FindArticleQuery ) SortScope ( db * gorm . DB ) * gorm . DB {
2024-09-12 20:16:40 +08:00
if f . RateSort == "descend" {
db = db . Order ( "rate desc" )
} else if f . RateSort == "ascend" {
db = db . Order ( "rate asc" )
2024-09-13 20:11:00 +08:00
} else {
db = db . Order ( "id desc" )
2024-08-03 17:07:10 +08:00
}
return db
}
2024-08-31 12:46:18 +08:00
func ( a * articleApi ) Find ( query * FindArticleQuery ) ( articles [ ] v2 . Article , err error ) {
2024-08-03 17:07:10 +08:00
err = a . db . Scopes ( query . Scope ) . Find ( & articles ) . Error
return
}
2024-09-12 20:23:46 +08:00
func ( a * articleApi ) List ( query PageListQuery , scopes ... func ( db * gorm . DB ) * gorm . DB ) ( articles [ ] v2 . Article , total int64 , err error ) {
2024-08-26 17:51:14 +08:00
err = a . db . Scopes ( query . Scoper . Scope ) . Model ( & v2 . Article { } ) . Count ( & total ) . Error
2024-08-03 17:07:10 +08:00
if err != nil {
return
}
2024-09-13 20:11:00 +08:00
err = a . db . Scopes ( query . Scope ) . Scopes ( scopes ... ) . Find ( & articles ) . Error
2024-08-03 17:07:10 +08:00
return
}
2024-08-31 12:39:40 +08:00
//**************GET
2024-08-03 17:07:10 +08:00
type GetArticleQuery struct {
2024-08-31 12:39:40 +08:00
ID uint ` query:"id" `
Brand v2 . Brand ` query:"brand" `
Pid string ` query:"pid" `
History bool ` query:"history" `
}
func ( g * GetArticleQuery ) SetID ( id uint ) * GetArticleQuery {
g . ID = id
return g
}
func ( g * GetArticleQuery ) SetBrand ( brand v2 . Brand ) * GetArticleQuery {
g . Brand = brand
return g
}
func ( g * GetArticleQuery ) SetPid ( pid string ) * GetArticleQuery {
g . Pid = pid
return g
}
func ( g * GetArticleQuery ) SetHistory ( history bool ) * GetArticleQuery {
g . History = history
return g
}
func NewGetArticleQuery ( ) * GetArticleQuery {
return & GetArticleQuery { }
2024-08-03 17:07:10 +08:00
}
func ( g * GetArticleQuery ) Scope ( db * gorm . DB ) * gorm . DB {
2024-09-02 21:22:28 +08:00
db = db . Preload ( "Providers" ) . Preload ( "Providers.CalculateProcess" ) . Preload ( "Sellers" ) . Preload ( "Sellers.CalculateProcess" )
2024-08-03 17:07:10 +08:00
if g . ID != 0 {
2024-09-01 18:59:24 +08:00
db = db . Where ( "id=?" , g . ID )
2024-08-03 17:07:10 +08:00
}
if g . Brand != "" {
2024-09-01 18:59:24 +08:00
db = db . Where ( "brand=?" , g . Brand )
2024-08-03 17:07:10 +08:00
}
if g . Pid != "" {
2024-09-01 18:59:24 +08:00
db = db . Where ( "pid=?" , g . Pid )
2024-08-03 17:07:10 +08:00
}
if g . History {
db = db . Preload ( "Providers.HistoryPrice" ) . Preload ( "Sellers.HistoryPrice" )
}
return db
}
2024-08-31 12:46:18 +08:00
func ( a * articleApi ) Get ( query * GetArticleQuery ) ( article v2 . Article , err error ) {
2024-08-03 17:07:10 +08:00
err = a . db . Scopes ( query . Scope ) . First ( & article ) . Error
return
}
2024-09-01 17:10:18 +08:00
func ( a * articleApi ) AutoMigrate ( ) error {
return a . db . AutoMigrate ( & v2 . Article { } )
}