Advertisement
bruimafia

template rep

Mar 27th, 2025
218
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 7.56 KB | None | 0 0
  1. package repositories
  2.  
  3. import (
  4.     "document-flow-server/internal/apperrors"
  5.     "document-flow-server/internal/database"
  6.     "document-flow-server/internal/models"
  7.     "document-flow-server/internal/repositories/scopes"
  8.     "fmt"
  9.     "strings"
  10.  
  11.     "gorm.io/gorm"
  12. )
  13.  
  14. // GetAllTemplates получает список всех шаблонов
  15. func GetAllTemplates() (models.TemplatesResponse, error) {
  16.     var templates []models.Template
  17.     var totalCount int64
  18.  
  19.     err := database.OpenReadTransaction(func(tx *gorm.DB) error {
  20.         if err := tx.Model(&models.Template{}).Count(&totalCount).Error; err != nil {
  21.             return fmt.Errorf("не удалось получить количество шаблонов: %w", err)
  22.         }
  23.  
  24.         if err := tx.Scopes(scopes.PreloadCreator).
  25.             Order("updated_at DESC").
  26.             Find(&templates).Error; err != nil {
  27.             return fmt.Errorf("не удалось загрузить шаблоны: %w", err)
  28.         }
  29.  
  30.         for i := range templates {
  31.             templates[i].Creator.DepartmentUserToDepartmentWithTitle()
  32.         }
  33.  
  34.         return nil
  35.     })
  36.  
  37.     if err != nil {
  38.         return models.TemplatesResponse{}, err
  39.     }
  40.  
  41.     return models.TemplatesResponse{
  42.         Templates:  templates,
  43.         TotalCount: totalCount,
  44.         Page:       1,
  45.         Limit:      int(totalCount),
  46.     }, nil
  47. }
  48.  
  49. // GetTemplatesPaginated получает список шаблонов с пагинацией
  50. func GetTemplatesPaginated(page, limit int) (models.TemplatesResponse, error) {
  51.     var templates []models.Template
  52.     var totalCount int64
  53.  
  54.     offset := (page - 1) * limit
  55.  
  56.     err := database.OpenReadTransaction(func(tx *gorm.DB) error {
  57.         if err := tx.Model(&models.Template{}).Count(&totalCount).Error; err != nil {
  58.             return fmt.Errorf("не удалось получить количество шаблонов: %w", err)
  59.         }
  60.  
  61.         if err := tx.Scopes(scopes.PreloadCreator).
  62.             Order("updated_at DESC").
  63.             Limit(limit).
  64.             Offset(offset).
  65.             Find(&templates).Error; err != nil {
  66.             return fmt.Errorf("не удалось загрузить шаблоны: %w", err)
  67.         }
  68.  
  69.         for i := range templates {
  70.             templates[i].Creator.DepartmentUserToDepartmentWithTitle()
  71.         }
  72.  
  73.         return nil
  74.     })
  75.  
  76.     if err != nil {
  77.         return models.TemplatesResponse{}, err
  78.     }
  79.  
  80.     return models.TemplatesResponse{
  81.         Templates:  templates,
  82.         TotalCount: totalCount,
  83.         Page:       page,
  84.         Limit:      limit,
  85.     }, nil
  86. }
  87.  
  88. // CreateTemplate создаёт новый шаблон и возвращает его с предзагруженными данными
  89. func CreateTemplate(template *models.Template) (*models.Template, error) {
  90.     err := database.OpenWriteTransaction(func(tx *gorm.DB) error {
  91.         if err := tx.Create(&template).Error; err != nil {
  92.             return apperrors.ErrTemplateCreationFailed
  93.         }
  94.  
  95.         if err := tx.Scopes(scopes.PreloadCreator).First(template, template.ID).Error; err != nil {
  96.             return fmt.Errorf("не удалось загрузить созданный шаблон: %w", err)
  97.         }
  98.  
  99.         template.Creator.DepartmentUserToDepartmentWithTitle()
  100.  
  101.         return nil
  102.     })
  103.  
  104.     if err != nil {
  105.         return nil, err
  106.     }
  107.  
  108.     return template, nil
  109. }
  110.  
  111. // GetTemplateById получает шаблон по его идентификатору
  112. func GetTemplateById(id uint64) (*models.Template, error) {
  113.     var template models.Template
  114.  
  115.     err := database.OpenReadTransaction(func(tx *gorm.DB) error {
  116.         if err := tx.Scopes(scopes.PreloadCreator).Unscoped().Where("id = ?", id).First(&template).Error; err != nil {
  117.             if err == gorm.ErrRecordNotFound {
  118.                 return apperrors.ErrTemplateNotFound
  119.             }
  120.             return fmt.Errorf("не удалось загрузить шаблон: %w", err)
  121.         }
  122.  
  123.         template.Creator.DepartmentUserToDepartmentWithTitle()
  124.  
  125.         return nil
  126.     })
  127.  
  128.     if err != nil {
  129.         return nil, err
  130.     }
  131.  
  132.     return &template, nil
  133. }
  134.  
  135. // UpdateTemplateById обновляет шаблон по его идентификатору
  136. func UpdateTemplateById(id uint64, updates map[string]interface{}) (*models.Template, error) {
  137.     var template models.Template
  138.  
  139.     // преобразование markers к StringArray
  140.     if markers, ok := updates["markers"].([]interface{}); ok {
  141.         var strArr models.StringArray
  142.         for _, m := range markers {
  143.             if s, ok := m.(string); ok {
  144.                 strArr = append(strArr, s)
  145.             }
  146.         }
  147.         updates["markers"] = strArr
  148.     }
  149.  
  150.     err := database.OpenWriteTransaction(func(tx *gorm.DB) error {
  151.         result := tx.Model(&models.Template{}).Where("id = ?", id).Updates(updates)
  152.         if result.Error != nil {
  153.             return result.Error
  154.         }
  155.         if result.RowsAffected == 0 {
  156.             return apperrors.ErrTemplateNotFound
  157.         }
  158.  
  159.         if err := tx.Scopes(scopes.PreloadCreator).First(&template, id).Error; err != nil {
  160.             return err
  161.         }
  162.  
  163.         template.Creator.DepartmentUserToDepartmentWithTitle()
  164.         return nil
  165.     })
  166.  
  167.     return &template, err
  168. }
  169.  
  170. // DeleteTemplateById удаляет шаблон по его идентификатору
  171. func DeleteTemplateById(id uint64) error {
  172.     template, err := GetTemplateById(id)
  173.     if err != nil {
  174.         return err
  175.     }
  176.  
  177.     return database.OpenWriteTransaction(func(tx *gorm.DB) error {
  178.         if err := tx.Delete(template).Error; err != nil {
  179.             return apperrors.ErrTemplateDeleteFailed
  180.         }
  181.         return nil
  182.     })
  183. }
  184.  
  185. // SearchTemplates выполняет универсальный поиск по заданному запросу по выбранным полям
  186. func SearchTemplates(query string, page, limit int) (models.TemplatesResponse, error) {
  187.     var templates []models.Template
  188.     var totalCount int64
  189.     var values []interface{}
  190.     var sb strings.Builder
  191.  
  192.     offset := (page - 1) * limit
  193.  
  194.     // поля, в которых ищем информацию
  195.     allowedFields := []string{"name", "description", "markers"}
  196.  
  197.     if query != "" {
  198.         for i, column := range allowedFields {
  199.             if i > 0 {
  200.                 sb.WriteString(" OR ")
  201.             }
  202.  
  203.             if column == "markers" {
  204.                 // для поля markers используем jsonb операции для поиска внутри JSON
  205.                 sb.WriteString("markers::text ILIKE ?")
  206.             } else {
  207.                 sb.WriteString(column + " ILIKE ?")
  208.             }
  209.             values = append(values, "%"+query+"%")
  210.         }
  211.     }
  212.     querySQL := sb.String()
  213.  
  214.     err := database.OpenReadTransaction(func(tx *gorm.DB) error {
  215.         txWithFilters := tx.Model(&models.Template{})
  216.         if querySQL != "" {
  217.             txWithFilters = txWithFilters.Where(querySQL, values...)
  218.         }
  219.  
  220.         if err := txWithFilters.Count(&totalCount).Error; err != nil {
  221.             return fmt.Errorf("ошибка подсчёта шаблонов: %w", err)
  222.         }
  223.  
  224.         txWithFilters = txWithFilters.Scopes(scopes.PreloadCreator).
  225.             Order("updated_at DESC").
  226.             Limit(limit).
  227.             Offset(offset)
  228.         if err := txWithFilters.Find(&templates).Error; err != nil {
  229.             return fmt.Errorf("ошибка загрузки шаблонов: %w", err)
  230.         }
  231.  
  232.         for i := range templates {
  233.             templates[i].Creator.DepartmentUserToDepartmentWithTitle()
  234.         }
  235.  
  236.         return nil
  237.     })
  238.  
  239.     if err != nil {
  240.         return models.TemplatesResponse{}, err
  241.     }
  242.  
  243.     return models.TemplatesResponse{
  244.         Templates:  templates,
  245.         TotalCount: totalCount,
  246.         Page:       page,
  247.         Limit:      limit,
  248.     }, nil
  249. }
  250.  
  251. // TemplateExistsByName проверяет, существует ли шаблон с таким именем
  252. func TemplateExistsByName(name string) (bool, error) {
  253.     var count int64
  254.  
  255.     err := database.OpenReadTransaction(func(tx *gorm.DB) error {
  256.         if err := tx.Model(&models.Template{}).
  257.             Where("name = ?", name).
  258.             Count(&count).Error; err != nil {
  259.             return fmt.Errorf("ошибка при проверке существования шаблона: %w", err)
  260.         }
  261.         return nil
  262.     })
  263.  
  264.     if err != nil {
  265.         return false, err
  266.     }
  267.  
  268.     return count > 0, nil
  269. }
  270.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement