hotupdate.go 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. /**
  2. * @author chengliang
  3. * @date 2026/1/13 10:54
  4. * @brief
  5. *
  6. **/
  7. package hotupdate
  8. import (
  9. "context"
  10. "fmt"
  11. "time"
  12. "github.com/kamva/mgm/v3"
  13. "go.mongodb.org/mongo-driver/bson"
  14. "go.mongodb.org/mongo-driver/bson/primitive"
  15. "go.mongodb.org/mongo-driver/mongo/options"
  16. )
  17. // VersionService 版本信息服务
  18. type TVersionDB struct {
  19. collection *mgm.Collection
  20. }
  21. func NewVersionService() *TVersionDB {
  22. return &TVersionDB{
  23. collection: mgm.Coll(&MVersionInfo{}),
  24. }
  25. }
  26. // Create 创建版本
  27. func (s *TVersionDB) Create(version *MVersionInfo) error {
  28. // 检查是否存在相同版本
  29. existing, err := s.FindOne(bson.M{
  30. "project": version.Proj,
  31. "os": version.Os,
  32. "version": version.Version,
  33. })
  34. if err == nil && existing != nil {
  35. return fmt.Errorf("版本 %s-%s-%s 已存在", version.Proj, version.Os, version.Version)
  36. }
  37. // 插入新版本
  38. return s.collection.Create(version)
  39. }
  40. // Update 更新版本
  41. func (s *TVersionDB) Update(id string, updates map[string]interface{}) (*MVersionInfo, error) {
  42. objectID, err := primitive.ObjectIDFromHex(id)
  43. if err != nil {
  44. return nil, fmt.Errorf("无效ID: %w", err)
  45. }
  46. // 查找并更新
  47. filter := bson.M{"_id": objectID}
  48. update := bson.M{"$set": updates}
  49. opts := options.FindOneAndUpdate().
  50. SetReturnDocument(options.After)
  51. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  52. defer cancel()
  53. var result MVersionInfo
  54. err = s.collection.FindOneAndUpdate(ctx, filter, update, opts).Decode(&result)
  55. if err != nil {
  56. return nil, fmt.Errorf("更新失败: %w", err)
  57. }
  58. return &result, nil
  59. }
  60. // Delete 删除版本
  61. func (s *TVersionDB) Delete(id string) error {
  62. objectID, err := primitive.ObjectIDFromHex(id)
  63. if err != nil {
  64. return fmt.Errorf("无效ID: %w", err)
  65. }
  66. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  67. defer cancel()
  68. result, err := s.collection.DeleteOne(ctx, bson.M{"_id": objectID})
  69. if err != nil {
  70. return fmt.Errorf("删除失败: %w", err)
  71. }
  72. if result.DeletedCount == 0 {
  73. return fmt.Errorf("未找到记录")
  74. }
  75. return nil
  76. }
  77. // FindOne 查找单个版本
  78. func (s *TVersionDB) FindOne(filter bson.M) (*MVersionInfo, error) {
  79. var result MVersionInfo
  80. err := s.collection.First(filter, &result)
  81. if err != nil {
  82. return nil, err
  83. }
  84. return &result, nil
  85. }
  86. // Find 查找多个版本
  87. func (s *TVersionDB) Find(filter bson.M, opts ...*options.FindOptions) ([]MVersionInfo, error) {
  88. var results []MVersionInfo
  89. err := s.collection.SimpleFind(&results, filter, opts...)
  90. return results, err
  91. }
  92. // ListByProjectAndOS 根据项目和系统列出版本
  93. func (s *TVersionDB) ListByProjectAndOS(project, os string, page, size int64) ([]MVersionInfo, int64, error) {
  94. filter := bson.M{"project": project}
  95. if os != "" {
  96. filter["os"] = os
  97. }
  98. // 获取总数
  99. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  100. defer cancel()
  101. total, err := s.collection.CountDocuments(ctx, filter)
  102. if err != nil {
  103. return nil, 0, err
  104. }
  105. // 分页查询
  106. opts := options.Find().
  107. SetSort(bson.M{"created_at": -1}). // 按版本降序
  108. SetSkip((page - 1) * size).
  109. SetLimit(size)
  110. results, err := s.Find(filter, opts)
  111. if err != nil {
  112. return nil, 0, err
  113. }
  114. return results, total, nil
  115. }