All checks were successful
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Successful in 5m16s
主要变更: - 新增 Carrier CRUD API(创建、列表、详情、更新、删除、状态更新) - IotCard/IotCardImportTask 添加 carrier_type/carrier_name 冗余字段 - 移除 Carrier 表的 channel_name/channel_code 字段 - 查询时直接使用冗余字段,避免 JOIN Carrier 表 - 添加数据库迁移脚本(000021-000023) - 添加单元测试和集成测试 - 同步更新 OpenAPI 文档和 specs
84 lines
2.2 KiB
Go
84 lines
2.2 KiB
Go
package postgres
|
|
|
|
import (
|
|
"context"
|
|
|
|
"gorm.io/gorm"
|
|
|
|
"github.com/break/junhong_cmp_fiber/internal/model"
|
|
"github.com/break/junhong_cmp_fiber/internal/store"
|
|
)
|
|
|
|
type CarrierStore struct {
|
|
db *gorm.DB
|
|
}
|
|
|
|
func NewCarrierStore(db *gorm.DB) *CarrierStore {
|
|
return &CarrierStore{db: db}
|
|
}
|
|
|
|
func (s *CarrierStore) Create(ctx context.Context, carrier *model.Carrier) error {
|
|
return s.db.WithContext(ctx).Create(carrier).Error
|
|
}
|
|
|
|
func (s *CarrierStore) GetByID(ctx context.Context, id uint) (*model.Carrier, error) {
|
|
var carrier model.Carrier
|
|
if err := s.db.WithContext(ctx).First(&carrier, id).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &carrier, nil
|
|
}
|
|
|
|
func (s *CarrierStore) GetByCode(ctx context.Context, code string) (*model.Carrier, error) {
|
|
var carrier model.Carrier
|
|
if err := s.db.WithContext(ctx).Where("carrier_code = ?", code).First(&carrier).Error; err != nil {
|
|
return nil, err
|
|
}
|
|
return &carrier, nil
|
|
}
|
|
|
|
func (s *CarrierStore) Update(ctx context.Context, carrier *model.Carrier) error {
|
|
return s.db.WithContext(ctx).Save(carrier).Error
|
|
}
|
|
|
|
func (s *CarrierStore) Delete(ctx context.Context, id uint) error {
|
|
return s.db.WithContext(ctx).Delete(&model.Carrier{}, id).Error
|
|
}
|
|
|
|
func (s *CarrierStore) List(ctx context.Context, opts *store.QueryOptions, filters map[string]interface{}) ([]*model.Carrier, int64, error) {
|
|
var carriers []*model.Carrier
|
|
var total int64
|
|
|
|
query := s.db.WithContext(ctx).Model(&model.Carrier{})
|
|
|
|
if carrierType, ok := filters["carrier_type"].(string); ok && carrierType != "" {
|
|
query = query.Where("carrier_type = ?", carrierType)
|
|
}
|
|
if carrierName, ok := filters["carrier_name"].(string); ok && carrierName != "" {
|
|
query = query.Where("carrier_name LIKE ?", "%"+carrierName+"%")
|
|
}
|
|
if status, ok := filters["status"]; ok {
|
|
query = query.Where("status = ?", status)
|
|
}
|
|
|
|
if err := query.Count(&total).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
if opts == nil {
|
|
opts = store.DefaultQueryOptions()
|
|
}
|
|
offset := (opts.Page - 1) * opts.PageSize
|
|
query = query.Offset(offset).Limit(opts.PageSize)
|
|
|
|
if opts.OrderBy != "" {
|
|
query = query.Order(opts.OrderBy)
|
|
}
|
|
|
|
if err := query.Find(&carriers).Error; err != nil {
|
|
return nil, 0, err
|
|
}
|
|
|
|
return carriers, total, nil
|
|
}
|