database.go 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429
  1. package tcb
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/v2/util"
  5. )
  6. const (
  7. // 数据库导入
  8. databaseMigrateImportURL = "https://api.weixin.qq.com/tcb/databasemigrateimport"
  9. // 数据库导出
  10. databaseMigrateExportURL = "https://api.weixin.qq.com/tcb/databasemigrateexport"
  11. // 数据库迁移状态查询
  12. databaseMigrateQueryInfoURL = "https://api.weixin.qq.com/tcb/databasemigratequeryinfo"
  13. // 变更数据库索引
  14. updateIndexURL = "https://api.weixin.qq.com/tcb/updateindex"
  15. // 新增集合
  16. databaseCollectionAddURL = "https://api.weixin.qq.com/tcb/databasecollectionadd"
  17. // 删除集合
  18. databaseCollectionDeleteURL = "https://api.weixin.qq.com/tcb/databasecollectiondelete"
  19. // 获取特定云环境下集合信息
  20. databaseCollectionGetURL = "https://api.weixin.qq.com/tcb/databasecollectionget"
  21. // 数据库插入记录
  22. databaseAddURL = "https://api.weixin.qq.com/tcb/databaseadd"
  23. // 数据库删除记录
  24. databaseDeleteURL = "https://api.weixin.qq.com/tcb/databasedelete"
  25. // 数据库更新记录
  26. databaseUpdateURL = "https://api.weixin.qq.com/tcb/databaseupdate"
  27. // 数据库查询记录
  28. databaseQueryURL = "https://api.weixin.qq.com/tcb/databasequery"
  29. // 统计集合记录数或统计查询语句对应的结果记录数
  30. databaseCountURL = "https://api.weixin.qq.com/tcb/databasecount"
  31. // ConflictModeInster 冲突处理模式 插入
  32. ConflictModeInster ConflictMode = 1
  33. // ConflictModeUpsert 冲突处理模式 更新
  34. ConflictModeUpsert ConflictMode = 2
  35. // FileTypeJSON 的合法值 json
  36. FileTypeJSON FileType = 1
  37. // FileTypeCsv 的合法值 csv
  38. FileTypeCsv FileType = 2
  39. )
  40. // ConflictMode 冲突处理模式
  41. type ConflictMode int
  42. // FileType 文件上传和导出的允许文件类型
  43. type FileType int
  44. // ValidDirections 合法的 direction 值
  45. var ValidDirections = []string{"1", "-1", "2dsphere"}
  46. // DatabaseMigrateExportReq 数据库出 请求参数
  47. type DatabaseMigrateExportReq struct {
  48. Env string `json:"env,omitempty"` // 云环境 ID
  49. FilePath string `json:"file_path,omitempty"` // 导出文件路径 (导入文件需先上传到同环境的存储中,可使用开发者工具或 HTTP API 的上传文件 API 上传)
  50. FileType FileType `json:"file_type,omitempty"` // 导出文件类型,文件格式参考数据库导入指引中的文件格式部分 1:json 2:csv
  51. Query string `json:"query,omitempty"` // 导出条件
  52. }
  53. // DatabaseMigrateExportRes 数据库导出 返回结果
  54. type DatabaseMigrateExportRes struct {
  55. util.CommonError
  56. JobID int64 `json:"job_id"` // 导出任务 ID,可使用数据库迁移进度查询 API 查询导入进度及结果
  57. }
  58. // DatabaseMigrateImportReq 数据库导入 请求参数
  59. type DatabaseMigrateImportReq struct {
  60. Env string `json:"env,omitempty"` // 云环境 ID
  61. CollectionName string `json:"collection_name,omitempty"` // 集合名称
  62. FilePath string `json:"file_path,omitempty"` // 导出文件路径(文件会导出到同环境的云存储中,可使用获取下载链接 API 获取下载链接)
  63. FileType FileType `json:"file_type,omitempty"` // 导入文件类型,文件格式参考数据库导入指引中的文件格式部分 1:json 2:csv
  64. StopOnError bool `json:"stop_on_error,omitempty"` // 是否在遇到错误时停止导入
  65. ConflictMode ConflictMode `json:"conflict_mode,omitempty"` // 冲突处理模式 1:inster 2:UPSERT
  66. }
  67. // DatabaseMigrateImportRes 数据库导入 返回结果
  68. type DatabaseMigrateImportRes struct {
  69. util.CommonError
  70. JobID int64 `json:"job_id"` // 导入任务 ID,可使用数据库迁移进度查询 API 查询导入进度及结果
  71. }
  72. // DatabaseMigrateQueryInfoRes 数据库迁移状态查询
  73. type DatabaseMigrateQueryInfoRes struct {
  74. util.CommonError
  75. Status string `json:"status"` // 导出状态
  76. RecordSuccess int64 `json:"record_success"` // 导出成功记录数
  77. RecordFail int64 `json:"record_fail"` // 导出失败记录数
  78. ErrMsg string `json:"err_msg"` // 导出错误信息
  79. FileURL string `json:"file_url"` // 导出文件下载地址
  80. }
  81. // UpdateIndexReq 变更数据库索引 请求参数
  82. type UpdateIndexReq struct {
  83. Env string `json:"env,omitempty"` // 云环境 ID
  84. CollectionName string `json:"collection_name,omitempty"` // 集合名称
  85. CreateIndexes []CreateIndex `json:"create_indexes,omitempty"` // 新增索引
  86. DropIndexes []DropIndex `json:"drop_indexes,omitempty"` // 删除索引
  87. }
  88. // CreateIndex 新增索引
  89. type CreateIndex struct {
  90. Name string `json:"name,omitempty"` // 索引名
  91. Unique bool `json:"unique,omitempty"` // 是否唯一
  92. Keys []CreateIndexKey `json:"keys,omitempty"` // 索引字段
  93. }
  94. // CreateIndexKey create index key
  95. type CreateIndexKey struct {
  96. Name string `json:"name,omitempty"` // 字段名
  97. Direction string `json:"direction,omitempty"` // 字段排序
  98. }
  99. // DropIndex 删除索引
  100. type DropIndex struct {
  101. Name string `json:"name,omitempty"`
  102. }
  103. // DatabaseCollectionReq 新增/删除集合请求参数
  104. type DatabaseCollectionReq struct {
  105. Env string `json:"env,omitempty"` // 云环境 ID
  106. CollectionName string `json:"collection_name,omitempty"` // 集合名称
  107. }
  108. // DatabaseCollectionGetReq 获取特定云环境下集合信息请求
  109. type DatabaseCollectionGetReq struct {
  110. Env string `json:"env,omitempty"` // 云环境 ID
  111. Limit int64 `json:"limit,omitempty"` // 获取数量限制
  112. Offset int64 `json:"offset,omitempty"` // 偏移量
  113. }
  114. // DatabaseCollectionGetRes 获取特定云环境下集合信息结果
  115. type DatabaseCollectionGetRes struct {
  116. util.CommonError
  117. Pager struct {
  118. Limit int64 `json:"limit"` // 单次查询限制
  119. Offset int64 `json:"offset"` // 偏移量
  120. Total int64 `json:"total"` // 符合查询条件的记录总数
  121. } `json:"pager"`
  122. Collections []struct {
  123. Name string `json:"name"` // 集合名
  124. Count int64 `json:"count"` // 表中文档数量
  125. Size int64 `json:"size"` // 表的大小(即表中文档总大小),单位:字节
  126. IndexCount int64 `json:"index_count"` // 索引数量
  127. IndexSize int64 `json:"index_size"` // 索引占用大小,单位:字节
  128. } `json:"collections"`
  129. }
  130. // DatabaseReq 数据库插入/删除/更新/查询/统计记录请求参数
  131. type DatabaseReq struct {
  132. Env string `json:"env,omitempty"` // 云环境 ID
  133. Query string `json:"query,omitempty"` // 数据库操作语句
  134. }
  135. // DatabaseAddRes 数据库插入记录返回结果
  136. type DatabaseAddRes struct {
  137. util.CommonError
  138. IDList []string `json:"id_list"` // 插入成功的数据集合主键_id。
  139. }
  140. // DatabaseDeleteRes 数据库删除记录返回结果
  141. type DatabaseDeleteRes struct {
  142. util.CommonError
  143. Deleted int64 `json:"deleted"` // 删除记录数量
  144. }
  145. // DatabaseUpdateRes 数据库更新记录返回结果
  146. type DatabaseUpdateRes struct {
  147. util.CommonError
  148. Matched int64 `json:"matched"` // 更新条件匹配到的结果数
  149. Modified int64 `json:"modified"` // 修改的记录数,注意:使用 set 操作新插入的数据不计入修改数目
  150. ID string `json:"id"`
  151. }
  152. // DatabaseQueryRes 数据库查询记录 返回结果
  153. type DatabaseQueryRes struct {
  154. util.CommonError
  155. Pager struct {
  156. Limit int64 `json:"limit"` // 单次查询限制
  157. Offset int64 `json:"offset"` // 偏移量
  158. Total int64 `json:"total"` // 符合查询条件的记录总数
  159. } `json:"pager"`
  160. Data []string `json:"data"`
  161. }
  162. // DatabaseCountRes 统计集合记录数或统计查询语句对应的结果记录数 返回结果
  163. type DatabaseCountRes struct {
  164. util.CommonError
  165. Count int64 `json:"count"` // 记录数量
  166. }
  167. // DatabaseMigrateImport 数据库导入
  168. //
  169. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateImport.html
  170. func (tcb *Tcb) DatabaseMigrateImport(req *DatabaseMigrateImportReq) (*DatabaseMigrateImportRes, error) {
  171. accessToken, err := tcb.GetAccessToken()
  172. if err != nil {
  173. return nil, err
  174. }
  175. uri := fmt.Sprintf("%s?access_token=%s", databaseMigrateImportURL, accessToken)
  176. response, err := util.PostJSON(uri, req)
  177. if err != nil {
  178. return nil, err
  179. }
  180. databaseMigrateImportRes := &DatabaseMigrateImportRes{}
  181. err = util.DecodeWithError(response, databaseMigrateImportRes, "DatabaseMigrateImport")
  182. return databaseMigrateImportRes, err
  183. }
  184. // DatabaseMigrateExport 数据库导出
  185. //
  186. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateExport.html
  187. func (tcb *Tcb) DatabaseMigrateExport(req *DatabaseMigrateExportReq) (*DatabaseMigrateExportRes, error) {
  188. accessToken, err := tcb.GetAccessToken()
  189. if err != nil {
  190. return nil, err
  191. }
  192. uri := fmt.Sprintf("%s?access_token=%s", databaseMigrateExportURL, accessToken)
  193. response, err := util.PostJSON(uri, req)
  194. if err != nil {
  195. return nil, err
  196. }
  197. databaseMigrateExportRes := &DatabaseMigrateExportRes{}
  198. err = util.DecodeWithError(response, databaseMigrateExportRes, "DatabaseMigrateExport")
  199. return databaseMigrateExportRes, err
  200. }
  201. // DatabaseMigrateQueryInfo 数据库迁移状态查询
  202. //
  203. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateQueryInfo.html
  204. func (tcb *Tcb) DatabaseMigrateQueryInfo(env string, jobID int64) (*DatabaseMigrateQueryInfoRes, error) {
  205. accessToken, err := tcb.GetAccessToken()
  206. if err != nil {
  207. return nil, err
  208. }
  209. uri := fmt.Sprintf("%s?access_token=%s", databaseMigrateQueryInfoURL, accessToken)
  210. response, err := util.PostJSON(uri, map[string]interface{}{
  211. "env": env,
  212. "job_id": jobID,
  213. })
  214. if err != nil {
  215. return nil, err
  216. }
  217. databaseMigrateQueryInfoRes := &DatabaseMigrateQueryInfoRes{}
  218. err = util.DecodeWithError(response, databaseMigrateQueryInfoRes, "DatabaseMigrateQueryInfo")
  219. return databaseMigrateQueryInfoRes, err
  220. }
  221. // UpdateIndex 变更数据库索引
  222. // https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/updateIndex.html
  223. func (tcb *Tcb) UpdateIndex(req *UpdateIndexReq) error {
  224. accessToken, err := tcb.GetAccessToken()
  225. if err != nil {
  226. return err
  227. }
  228. uri := fmt.Sprintf("%s?access_token=%s", updateIndexURL, accessToken)
  229. response, err := util.PostJSON(uri, req)
  230. if err != nil {
  231. return err
  232. }
  233. return util.DecodeWithCommonError(response, "UpdateIndex")
  234. }
  235. // DatabaseCollectionAdd 新增集合
  236. //
  237. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionAdd.html
  238. func (tcb *Tcb) DatabaseCollectionAdd(env, collectionName string) error {
  239. accessToken, err := tcb.GetAccessToken()
  240. if err != nil {
  241. return err
  242. }
  243. uri := fmt.Sprintf("%s?access_token=%s", databaseCollectionAddURL, accessToken)
  244. response, err := util.PostJSON(uri, &DatabaseCollectionReq{
  245. Env: env,
  246. CollectionName: collectionName,
  247. })
  248. if err != nil {
  249. return err
  250. }
  251. return util.DecodeWithCommonError(response, "DatabaseCollectionAdd")
  252. }
  253. // DatabaseCollectionDelete 删除集合
  254. //
  255. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionDelete.html
  256. func (tcb *Tcb) DatabaseCollectionDelete(env, collectionName string) error {
  257. accessToken, err := tcb.GetAccessToken()
  258. if err != nil {
  259. return err
  260. }
  261. uri := fmt.Sprintf("%s?access_token=%s", databaseCollectionDeleteURL, accessToken)
  262. response, err := util.PostJSON(uri, &DatabaseCollectionReq{
  263. Env: env,
  264. CollectionName: collectionName,
  265. })
  266. if err != nil {
  267. return err
  268. }
  269. return util.DecodeWithCommonError(response, "DatabaseCollectionDelete")
  270. }
  271. // DatabaseCollectionGet 获取特定云环境下集合信息
  272. //
  273. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionGet.html
  274. func (tcb *Tcb) DatabaseCollectionGet(env string, limit, offset int64) (*DatabaseCollectionGetRes, error) {
  275. accessToken, err := tcb.GetAccessToken()
  276. if err != nil {
  277. return nil, err
  278. }
  279. uri := fmt.Sprintf("%s?access_token=%s", databaseCollectionGetURL, accessToken)
  280. response, err := util.PostJSON(uri, &DatabaseCollectionGetReq{
  281. Env: env,
  282. Limit: limit,
  283. Offset: offset,
  284. })
  285. if err != nil {
  286. return nil, err
  287. }
  288. databaseCollectionGetRes := &DatabaseCollectionGetRes{}
  289. err = util.DecodeWithError(response, databaseCollectionGetRes, "DatabaseCollectionGet")
  290. return databaseCollectionGetRes, err
  291. }
  292. // DatabaseAdd 数据库插入记录
  293. //
  294. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseAdd.html
  295. func (tcb *Tcb) DatabaseAdd(env, query string) (*DatabaseAddRes, error) {
  296. accessToken, err := tcb.GetAccessToken()
  297. if err != nil {
  298. return nil, err
  299. }
  300. uri := fmt.Sprintf("%s?access_token=%s", databaseAddURL, accessToken)
  301. response, err := util.PostJSON(uri, &DatabaseReq{
  302. Env: env,
  303. Query: query,
  304. })
  305. if err != nil {
  306. return nil, err
  307. }
  308. databaseAddRes := &DatabaseAddRes{}
  309. err = util.DecodeWithError(response, databaseAddRes, "DatabaseAdd")
  310. return databaseAddRes, err
  311. }
  312. // DatabaseDelete 数据库插入记录
  313. //
  314. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseDelete.html
  315. func (tcb *Tcb) DatabaseDelete(env, query string) (*DatabaseDeleteRes, error) {
  316. accessToken, err := tcb.GetAccessToken()
  317. if err != nil {
  318. return nil, err
  319. }
  320. uri := fmt.Sprintf("%s?access_token=%s", databaseDeleteURL, accessToken)
  321. response, err := util.PostJSON(uri, &DatabaseReq{
  322. Env: env,
  323. Query: query,
  324. })
  325. if err != nil {
  326. return nil, err
  327. }
  328. databaseDeleteRes := &DatabaseDeleteRes{}
  329. err = util.DecodeWithError(response, databaseDeleteRes, "DatabaseDelete")
  330. return databaseDeleteRes, err
  331. }
  332. // DatabaseUpdate 数据库插入记录
  333. //
  334. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseUpdate.html
  335. func (tcb *Tcb) DatabaseUpdate(env, query string) (*DatabaseUpdateRes, error) {
  336. accessToken, err := tcb.GetAccessToken()
  337. if err != nil {
  338. return nil, err
  339. }
  340. uri := fmt.Sprintf("%s?access_token=%s", databaseUpdateURL, accessToken)
  341. response, err := util.PostJSON(uri, &DatabaseReq{
  342. Env: env,
  343. Query: query,
  344. })
  345. if err != nil {
  346. return nil, err
  347. }
  348. databaseUpdateRes := &DatabaseUpdateRes{}
  349. err = util.DecodeWithError(response, databaseUpdateRes, "DatabaseUpdate")
  350. return databaseUpdateRes, err
  351. }
  352. // DatabaseQuery 数据库查询记录
  353. //
  354. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseQuery.html
  355. func (tcb *Tcb) DatabaseQuery(env, query string) (*DatabaseQueryRes, error) {
  356. accessToken, err := tcb.GetAccessToken()
  357. if err != nil {
  358. return nil, err
  359. }
  360. uri := fmt.Sprintf("%s?access_token=%s", databaseQueryURL, accessToken)
  361. response, err := util.PostJSON(uri, &DatabaseReq{
  362. Env: env,
  363. Query: query,
  364. })
  365. if err != nil {
  366. return nil, err
  367. }
  368. databaseQueryRes := &DatabaseQueryRes{}
  369. err = util.DecodeWithError(response, databaseQueryRes, "DatabaseQuery")
  370. return databaseQueryRes, err
  371. }
  372. // DatabaseCount 统计集合记录数或统计查询语句对应的结果记录数
  373. //
  374. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCount.html
  375. func (tcb *Tcb) DatabaseCount(env, query string) (*DatabaseCountRes, error) {
  376. accessToken, err := tcb.GetAccessToken()
  377. if err != nil {
  378. return nil, err
  379. }
  380. uri := fmt.Sprintf("%s?access_token=%s", databaseCountURL, accessToken)
  381. response, err := util.PostJSON(uri, &DatabaseReq{
  382. Env: env,
  383. Query: query,
  384. })
  385. if err != nil {
  386. return nil, err
  387. }
  388. databaseCountRes := &DatabaseCountRes{}
  389. err = util.DecodeWithError(response, databaseCountRes, "DatabaseCount")
  390. return databaseCountRes, err
  391. }