作者 tangxvhui

提交文件

@@ -32,5 +32,3 @@ lastupdate.tmp @@ -32,5 +32,3 @@ lastupdate.tmp
32 32
33 public/* 33 public/*
34 logs/ 34 logs/
35 -cmd/discuss/api/api  
36 -discuss  
  1 +package repository
  2 +
  3 +import (
  4 + "context"
  5 +
  6 + "github.com/jinzhu/copier"
  7 + "github.com/pkg/errors"
  8 + "github.com/tiptok/gocomm/pkg/cache"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/models"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  12 + "gorm.io/gorm"
  13 +)
  14 +
  15 +type ArticleTagRepository struct {
  16 + *cache.CachedRepository
  17 +}
  18 +
  19 +func (repository *ArticleTagRepository) Insert(ctx context.Context, conn transaction.Conn, dm *domain.ArticleTag) (*domain.ArticleTag, error) {
  20 + var (
  21 + err error
  22 + m = &models.ArticleTag{}
  23 + tx = conn.DB()
  24 + )
  25 + if m, err = repository.DomainModelToModel(dm); err != nil {
  26 + return nil, err
  27 + }
  28 + if tx = tx.Model(m).Save(m); tx.Error != nil {
  29 + return nil, tx.Error
  30 + }
  31 + dm.Id = m.Id
  32 + return repository.ModelToDomainModel(m)
  33 +
  34 +}
  35 +
  36 +func (repository *ArticleTagRepository) Update(ctx context.Context, conn transaction.Conn, dm *domain.ArticleTag) (*domain.ArticleTag, error) {
  37 + var (
  38 + err error
  39 + m *models.ArticleTag
  40 + tx = conn.DB()
  41 + )
  42 + if m, err = repository.DomainModelToModel(dm); err != nil {
  43 + return nil, err
  44 + }
  45 + queryFunc := func() (interface{}, error) {
  46 + tx = tx.Model(m).Updates(m)
  47 + return nil, tx.Error
  48 + }
  49 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  50 + return nil, err
  51 + }
  52 + return repository.ModelToDomainModel(m)
  53 +}
  54 +
  55 +func (repository *ArticleTagRepository) UpdateWithVersion(ctx context.Context, transaction transaction.Conn, dm *domain.ArticleTag) (*domain.ArticleTag, error) {
  56 + var (
  57 + err error
  58 + m *models.ArticleTag
  59 + tx = transaction.DB()
  60 + )
  61 + if m, err = repository.DomainModelToModel(dm); err != nil {
  62 + return nil, err
  63 + }
  64 + oldVersion := dm.Version
  65 + m.Version += 1
  66 + queryFunc := func() (interface{}, error) {
  67 + tx = tx.Model(m).Select("*").Where("id = ?", m.Id).Where("version = ?", oldVersion).Updates(m)
  68 + if tx.RowsAffected == 0 {
  69 + return nil, domain.ErrUpdateFail
  70 + }
  71 + return nil, tx.Error
  72 + }
  73 + if _, err = repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  74 + return nil, err
  75 + }
  76 + return repository.ModelToDomainModel(m)
  77 +}
  78 +
  79 +func (repository *ArticleTagRepository) Delete(ctx context.Context, conn transaction.Conn, dm *domain.ArticleTag) (*domain.ArticleTag, error) {
  80 + var (
  81 + tx = conn.DB()
  82 + m = &models.ArticleTag{Id: dm.Id}
  83 + )
  84 + queryFunc := func() (interface{}, error) {
  85 + tx = tx.Where("id = ?", m.Id).Delete(m)
  86 + return m, tx.Error
  87 + }
  88 + if _, err := repository.Query(queryFunc, m.CacheKeyFunc()); err != nil {
  89 + return dm, err
  90 + }
  91 + return repository.ModelToDomainModel(m)
  92 +}
  93 +
  94 +func (repository *ArticleTagRepository) FindOne(ctx context.Context, conn transaction.Conn, id int64) (*domain.ArticleTag, error) {
  95 + var (
  96 + err error
  97 + tx = conn.DB()
  98 + m = new(models.ArticleTag)
  99 + )
  100 + queryFunc := func() (interface{}, error) {
  101 + tx = tx.Model(m).Where("id = ?", id).First(m)
  102 + if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
  103 + return nil, domain.ErrNotFound
  104 + }
  105 + return m, tx.Error
  106 + }
  107 + cacheModel := new(models.ArticleTag)
  108 + cacheModel.Id = id
  109 + if err = repository.QueryCache(cacheModel.CacheKeyFunc, m, queryFunc); err != nil {
  110 + return nil, err
  111 + }
  112 + return repository.ModelToDomainModel(m)
  113 +}
  114 +
  115 +func (repository *ArticleTagRepository) Find(ctx context.Context, conn transaction.Conn, companyId int64, queryOptions map[string]interface{}) (int64, []*domain.ArticleTag, error) {
  116 + var (
  117 + tx = conn.DB()
  118 + ms []*models.ArticleTag
  119 + dms = make([]*domain.ArticleTag, 0)
  120 + total int64
  121 + )
  122 + queryFunc := func() (interface{}, error) {
  123 + tx = tx.Model(&ms).
  124 + Where("company_id=?", companyId).
  125 + Order("id desc")
  126 +
  127 + if v, ok := queryOptions["name"]; ok {
  128 + tx.Where("id like ?", v)
  129 + }
  130 + if v, ok := queryOptions["group"]; ok {
  131 + tx.Where("group like ?", v)
  132 + }
  133 +
  134 + if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
  135 + return dms, tx.Error
  136 + }
  137 + return dms, nil
  138 + }
  139 +
  140 + if _, err := repository.Query(queryFunc); err != nil {
  141 + return 0, nil, err
  142 + }
  143 +
  144 + for _, item := range ms {
  145 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  146 + return 0, dms, err
  147 + } else {
  148 + dms = append(dms, dm)
  149 + }
  150 + }
  151 + return total, dms, nil
  152 +}
  153 +
  154 +func (repository *ArticleTagRepository) ModelToDomainModel(from *models.ArticleTag) (*domain.ArticleTag, error) {
  155 + to := &domain.ArticleTag{}
  156 + err := copier.Copy(to, from)
  157 + return to, err
  158 +}
  159 +
  160 +func (repository *ArticleTagRepository) DomainModelToModel(from *domain.ArticleTag) (*models.ArticleTag, error) {
  161 + to := &models.ArticleTag{}
  162 + err := copier.Copy(to, from)
  163 + return to, err
  164 +}
  165 +
  166 +func NewArticleTagRepository(cache *cache.CachedRepository) domain.ArticleTagRepository {
  167 + return &ArticleTagRepository{CachedRepository: cache}
  168 +}