autoUpdateConfigRepo.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556
  1. package mongo
  2. import (
  3. "context"
  4. "errors"
  5. "fmt"
  6. "fwh-toolbox-server/database"
  7. "fwh-toolbox-server/domain"
  8. "time"
  9. "go.mongodb.org/mongo-driver/bson"
  10. "go.mongodb.org/mongo-driver/bson/primitive"
  11. "go.mongodb.org/mongo-driver/mongo"
  12. "go.mongodb.org/mongo-driver/mongo/options"
  13. )
  14. const (
  15. CollectionName_AutoUpdateConfigOption = "AutoUpdateConfigOption"
  16. CollectionName_AutoUpdateConfig = "AutoUpdateConfig"
  17. CollectionName_AutoUpdateAPowerVersion = "AutoUpdateAPowerVersion"
  18. CollectionName_AutoUpdatePackages = "AutoUpdatePackages"
  19. )
  20. /**************** 自动升级配置选项 ****************/
  21. // 读取自动升级配置的选项
  22. func GetAutoUpdateConfigOption() (*domain.AutoUpdateConfigOption, error) {
  23. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  24. defer cancel()
  25. collection := database.GetCollection(CollectionName_AutoUpdateConfigOption)
  26. update := bson.M{
  27. "$setOnInsert": bson.M{
  28. "_id": "options",
  29. "packages": domain.AutoUpdatePackagesOption{
  30. System: []string{},
  31. AGate: []string{},
  32. SubDevice: []string{},
  33. Others: []string{},
  34. },
  35. "aGateVersions": []string{},
  36. },
  37. }
  38. opts := options.FindOneAndUpdate().
  39. SetUpsert(true).
  40. SetReturnDocument(options.After)
  41. var cfg domain.AutoUpdateConfigOption
  42. err := collection.FindOneAndUpdate(ctx, bson.M{"_id": "options"}, update, opts).Decode(&cfg)
  43. if err != nil {
  44. return nil, err
  45. }
  46. return &cfg, nil
  47. }
  48. func insertPackageInfoToOption(packageType string, fileName string) error {
  49. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  50. defer cancel()
  51. collection := database.GetCollection(CollectionName_AutoUpdateConfigOption)
  52. var opt bson.M
  53. filter := bson.M{"_id": "options"}
  54. if err := collection.FindOne(
  55. ctx,
  56. filter,
  57. options.FindOne().
  58. SetProjection(bson.M{"packages." + packageType: 1}),
  59. ).Decode(&opt); err != nil && err != mongo.ErrNoDocuments { // 没有匹配的文档
  60. return err
  61. }
  62. newPackages := []string{}
  63. originalPackages, ok := opt["packages"].(bson.M)
  64. if ok {
  65. switch packageType {
  66. case "system":
  67. if packageList, ok := originalPackages["system"].([]string); ok {
  68. newPackages = append(packageList, fileName)
  69. }
  70. case "aGate":
  71. if packageList, ok := originalPackages["aGate"].([]string); ok {
  72. newPackages = append(packageList, fileName)
  73. }
  74. case "subDevice":
  75. if packageList, ok := originalPackages["subDevice"].([]string); ok {
  76. newPackages = append(packageList, fileName)
  77. }
  78. case "others":
  79. if packageList, ok := originalPackages["others"].([]string); ok {
  80. newPackages = append(packageList, fileName)
  81. }
  82. default:
  83. return fmt.Errorf("packageType unknown. packageType = %s", packageType)
  84. }
  85. }
  86. update := bson.M{
  87. "$set": bson.M{
  88. "packages." + packageType: newPackages,
  89. },
  90. "$setOnInsert": bson.M{
  91. "_id": "options",
  92. "aGateVersions": []string{},
  93. },
  94. }
  95. opts := options.Update().SetUpsert(true)
  96. _, err := collection.UpdateOne(ctx, filter, update, opts)
  97. return err
  98. }
  99. func deletePackageInfoByOption(packageType string, fileName string) error {
  100. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  101. defer cancel()
  102. collection := database.GetCollection(CollectionName_AutoUpdateConfigOption)
  103. var opt bson.M
  104. filter := bson.M{"_id": "options"}
  105. if err := collection.FindOne(
  106. ctx,
  107. filter,
  108. options.FindOne().
  109. SetProjection(bson.M{"packages." + packageType: 1}),
  110. ).Decode(&opt); err != nil && err != mongo.ErrNoDocuments { // 没有匹配的文档
  111. return err
  112. }
  113. packages := []string{}
  114. originalPackages, ok := opt["packages"].(bson.M)
  115. if ok {
  116. switch packageType {
  117. case "system":
  118. if packageList, ok := originalPackages["system"].([]string); ok {
  119. packages = packageList
  120. }
  121. case "aGate":
  122. if packageList, ok := originalPackages["aGate"].([]string); ok {
  123. packages = packageList
  124. }
  125. case "subDevice":
  126. if packageList, ok := originalPackages["subDevice"].([]string); ok {
  127. packages = packageList
  128. }
  129. case "others":
  130. if packageList, ok := originalPackages["others"].([]string); ok {
  131. packages = packageList
  132. }
  133. default:
  134. return fmt.Errorf("packageType unknown. packageType = %s", packageType)
  135. }
  136. }
  137. newPackages := []string{}
  138. for _, file := range packages {
  139. if file == fileName {
  140. continue
  141. }
  142. newPackages = append(newPackages, file)
  143. }
  144. if len(packages) == len(newPackages) {
  145. return fmt.Errorf("package option delete failed. fileName = %s", fileName)
  146. }
  147. update := bson.M{
  148. "$set": bson.M{
  149. "packages." + packageType: newPackages,
  150. },
  151. }
  152. _, err := collection.UpdateOne(ctx, filter, update)
  153. return err
  154. }
  155. func insertAGateVersionToOption(aGateVersion string) error {
  156. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  157. defer cancel()
  158. collection := database.GetCollection(CollectionName_AutoUpdateConfigOption)
  159. var opt bson.M
  160. filter := bson.M{"_id": "options"}
  161. if err := collection.FindOne(
  162. ctx,
  163. filter,
  164. options.FindOne().
  165. SetProjection(bson.M{"aGateVersions": 1}),
  166. ).Decode(&opt); err != nil && err != mongo.ErrNoDocuments { // 没有匹配的文档
  167. return err
  168. }
  169. versionList, ok := opt["aGateVersions"].([]string)
  170. if !ok {
  171. versionList = []string{}
  172. }
  173. for _, s := range versionList {
  174. if s == aGateVersion {
  175. return fmt.Errorf("aGateVersion(%s) already exists", aGateVersion)
  176. }
  177. }
  178. versionList = append(versionList, aGateVersion)
  179. update := bson.M{
  180. "$set": bson.M{
  181. "aGateVersions": versionList,
  182. },
  183. "$setOnInsert": bson.M{
  184. "_id": "options",
  185. "packages": domain.AutoUpdatePackagesOption{
  186. System: []string{},
  187. AGate: []string{},
  188. SubDevice: []string{},
  189. Others: []string{},
  190. },
  191. },
  192. }
  193. opts := options.Update().SetUpsert(true)
  194. _, err := collection.UpdateOne(ctx, filter, update, opts)
  195. return err
  196. }
  197. func deleteAGateVersionByOption(aGateVersion string) error {
  198. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  199. defer cancel()
  200. collection := database.GetCollection(CollectionName_AutoUpdateConfigOption)
  201. var opt bson.M
  202. filter := bson.M{"_id": "options"}
  203. if err := collection.FindOne(
  204. ctx,
  205. filter,
  206. options.FindOne().
  207. SetProjection(bson.M{"aGateVersions": 1}),
  208. ).Decode(&opt); err != nil && err != mongo.ErrNoDocuments { // 没有匹配的文档
  209. return err
  210. }
  211. versionList, ok := opt["aGateVersions"].([]string)
  212. if !ok {
  213. return nil
  214. }
  215. newVersions := []string{}
  216. for _, ver := range versionList {
  217. if ver == aGateVersion {
  218. continue
  219. }
  220. newVersions = append(newVersions, ver)
  221. }
  222. if len(versionList) == len(newVersions) {
  223. return fmt.Errorf("package option delete failed. aGateVersion = %s", aGateVersion)
  224. }
  225. update := bson.M{
  226. "$set": bson.M{
  227. "aGateVersions": newVersions,
  228. },
  229. }
  230. _, err := collection.UpdateOne(ctx, filter, update)
  231. return err
  232. }
  233. /**************** 自动升级包信息 ****************/
  234. func GetAutoUpdatePackages(fileName string) (*domain.AutoUpdatePackages, error) {
  235. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  236. defer cancel()
  237. collection := database.GetCollection(CollectionName_AutoUpdatePackages)
  238. var cfg domain.AutoUpdatePackages
  239. err := collection.FindOne(ctx, bson.M{"_id": fileName}).Decode(&cfg)
  240. if err != nil {
  241. return nil, err
  242. }
  243. return &cfg, nil
  244. }
  245. func CreateAutoUpdatePackage(packageType string, info domain.AutoUpdatePackages) error {
  246. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  247. defer cancel()
  248. collection := database.GetCollection(CollectionName_AutoUpdatePackages)
  249. // 依赖数据库唯一索引
  250. if _, err := collection.InsertOne(ctx, &info); err != nil {
  251. if mongo.IsDuplicateKeyError(err) {
  252. return errors.New("user already exists")
  253. }
  254. return fmt.Errorf("insert failed: %w", err)
  255. }
  256. // 插入分类表
  257. if err := insertPackageInfoToOption(packageType, info.Id); err != nil {
  258. // 插入失败,删除创建数据信息
  259. if _, delErr := collection.DeleteOne(ctx, bson.M{"_id": info.Id}); delErr != nil {
  260. return fmt.Errorf("insert option failed: %w, delete failed: %w", err, delErr)
  261. }
  262. return fmt.Errorf("insert option failed: %w", err)
  263. }
  264. return nil
  265. }
  266. func UpdateAutoUpdatePackage(fileName string, info domain.AutoUpdatePackages) error {
  267. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  268. defer cancel()
  269. collection := database.GetCollection(CollectionName_AutoUpdatePackages)
  270. res, err := collection.UpdateOne(ctx, bson.M{"_id": fileName}, bson.M{"$set": bson.M{
  271. "title": info.Title,
  272. "invVersion": info.InvVersion,
  273. }})
  274. if err != nil {
  275. return fmt.Errorf("update failed: %w", err)
  276. }
  277. if res.MatchedCount == 0 {
  278. return errors.New("file name not found, update rejected")
  279. }
  280. return nil
  281. }
  282. func DeleteAutoUpdatePackage(packageType string, fileName string) error {
  283. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  284. defer cancel()
  285. collection := database.GetCollection(CollectionName_AutoUpdatePackages)
  286. // 删除分类表中的文件名
  287. if err := deletePackageInfoByOption(packageType, fileName); err != nil {
  288. return fmt.Errorf("delete option failed: %w", err)
  289. }
  290. if _, err := collection.DeleteOne(ctx, bson.M{"_id": fileName}); err != nil {
  291. return fmt.Errorf("delete package info failed: %w", err)
  292. }
  293. return nil
  294. }
  295. /**************** 自动升级aPower版本信息 ****************/
  296. func GetAutoUpdateAPowerVersion() (*[]domain.AutoUpdateAPowerVersion, error) {
  297. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  298. defer cancel()
  299. collection := database.GetCollection(CollectionName_AutoUpdateAPowerVersion)
  300. cursor, err := collection.Find(ctx, bson.M{})
  301. if err != nil {
  302. return nil, err
  303. }
  304. defer cursor.Close(ctx)
  305. var versionList []domain.AutoUpdateAPowerVersion
  306. if err := cursor.All(ctx, &versionList); err != nil {
  307. return nil, err
  308. }
  309. if versionList == nil {
  310. versionList = []domain.AutoUpdateAPowerVersion{}
  311. }
  312. return &versionList, nil
  313. }
  314. func UpdateAutoUpdateAPowerVersion(version string, info domain.AutoUpdateAPowerVersion) error {
  315. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  316. defer cancel()
  317. collection := database.GetCollection(CollectionName_AutoUpdateAPowerVersion)
  318. filter := bson.M{"_id": version}
  319. update := bson.M{
  320. "$set": bson.M{
  321. "name": info.Name,
  322. "remark": info.Remark,
  323. },
  324. "$setOnInsert": bson.M{
  325. "_id": version,
  326. },
  327. }
  328. opts := options.Update().SetUpsert(true)
  329. _, err := collection.UpdateOne(ctx, filter, update, opts)
  330. if err != nil {
  331. return err
  332. }
  333. return nil
  334. }
  335. func DeleteAutoUpdateAPowerVersion(version string) error {
  336. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  337. defer cancel()
  338. collection := database.GetCollection(CollectionName_AutoUpdateAPowerVersion)
  339. _, err := collection.DeleteOne(ctx, bson.M{"_id": version})
  340. if err != nil {
  341. return err
  342. }
  343. return nil
  344. }
  345. /**************** 自动升级配置 ****************/
  346. func GetAutoUpdateConfig(aGateVersions string) (*domain.AutoUpdateConfig, error) {
  347. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  348. defer cancel()
  349. collection := database.GetCollection(CollectionName_AutoUpdateConfig)
  350. var cfg domain.AutoUpdateConfig
  351. err := collection.FindOne(ctx, bson.M{"_id": aGateVersions}).Decode(&cfg)
  352. if err != nil {
  353. return nil, err
  354. }
  355. return &cfg, nil
  356. }
  357. func UpdateAutoUpdateConfig(aGateVersions string, config domain.AutoUpdateConfig) error {
  358. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  359. defer cancel()
  360. collection := database.GetCollection(CollectionName_AutoUpdateConfig)
  361. filter := bson.M{"_id": aGateVersions}
  362. update := bson.M{
  363. "$set": bson.M{
  364. "config": config.Config,
  365. },
  366. "$setOnInsert": bson.M{
  367. "_id": aGateVersions,
  368. },
  369. }
  370. opts := options.Update().SetUpsert(true)
  371. result, err := collection.UpdateOne(ctx, filter, update, opts)
  372. if err != nil {
  373. return err
  374. }
  375. if result.UpsertedCount > 0 {
  376. // 插入操作
  377. // 添加aGate名到option表
  378. if err := insertAGateVersionToOption(aGateVersions); err != nil {
  379. // 插入失败,删除创建数据信息
  380. if _, delErr := collection.DeleteOne(ctx, filter); delErr != nil {
  381. return fmt.Errorf("insert option failed: %w, delete failed: %w", err, delErr)
  382. }
  383. return fmt.Errorf("insert option failed: %w", err)
  384. }
  385. }
  386. return nil
  387. }
  388. func DeleteAutoUpdateConfig(aGateVersions string) error {
  389. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  390. defer cancel()
  391. collection := database.GetCollection(CollectionName_AutoUpdateConfig)
  392. // 删除分类表中的版本
  393. if err := deleteAGateVersionByOption(aGateVersions); err != nil {
  394. return fmt.Errorf("delete option failed: %w", err)
  395. }
  396. _, err := collection.DeleteOne(ctx, bson.M{"_id": aGateVersions})
  397. if err != nil {
  398. return err
  399. }
  400. return nil
  401. }
  402. func CreateAutoUpdateSpecialConfig(aGateVersions string, config domain.AutoUpdateSpecialTypeConfig) error {
  403. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  404. defer cancel()
  405. collection := database.GetCollection(CollectionName_AutoUpdateConfig)
  406. filter := bson.M{"_id": aGateVersions}
  407. item := bson.M{
  408. "id": primitive.NewObjectID().Hex(),
  409. "title": config.Title,
  410. "emsVersions": config.EmsVersions,
  411. "aPowerVersions": config.APowerVersions,
  412. "specialUpdateOrder": config.SpecialUpdateOrder,
  413. "useDefaultUpdate": config.UseDefaultUpdate,
  414. }
  415. update := bson.M{
  416. "$push": bson.M{
  417. "config.specialType": item,
  418. },
  419. }
  420. _, err := collection.UpdateOne(ctx, filter, update)
  421. if err != nil {
  422. return err
  423. }
  424. return nil
  425. }
  426. func DeleteAutoUpdateSpecialConfig(aGateVersions string, id string) error {
  427. ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
  428. defer cancel()
  429. collection := database.GetCollection(CollectionName_AutoUpdateConfig)
  430. filter := bson.M{"_id": aGateVersions}
  431. update := bson.M{
  432. "$pull": bson.M{
  433. "config.specialType": bson.M{
  434. "id": id,
  435. },
  436. },
  437. }
  438. _, err := collection.UpdateOne(ctx, filter, update)
  439. if err != nil {
  440. return err
  441. }
  442. return nil
  443. }