autoUpdateConfigRepo.go 13 KB

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