database.go 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418
  1. package tcb
  2. import (
  3. "fmt"
  4. "github.com/silenceper/wechat/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. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateImport.html
  169. func (tcb *Tcb) DatabaseMigrateImport(req *DatabaseMigrateImportReq) (*DatabaseMigrateImportRes, error) {
  170. accessToken, err := tcb.GetAccessToken()
  171. if err != nil {
  172. return nil, err
  173. }
  174. uri := fmt.Sprintf("%s?access_token=%s", databaseMigrateImportURL, accessToken)
  175. response, err := util.PostJSON(uri, req)
  176. if err != nil {
  177. return nil, err
  178. }
  179. databaseMigrateImportRes := &DatabaseMigrateImportRes{}
  180. err = util.DecodeWithError(response, databaseMigrateImportRes, "DatabaseMigrateImport")
  181. return databaseMigrateImportRes, err
  182. }
  183. //DatabaseMigrateExport 数据库导出
  184. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateExport.html
  185. func (tcb *Tcb) DatabaseMigrateExport(req *DatabaseMigrateExportReq) (*DatabaseMigrateExportRes, error) {
  186. accessToken, err := tcb.GetAccessToken()
  187. if err != nil {
  188. return nil, err
  189. }
  190. uri := fmt.Sprintf("%s?access_token=%s", databaseMigrateExportURL, accessToken)
  191. response, err := util.PostJSON(uri, req)
  192. if err != nil {
  193. return nil, err
  194. }
  195. databaseMigrateExportRes := &DatabaseMigrateExportRes{}
  196. err = util.DecodeWithError(response, databaseMigrateExportRes, "DatabaseMigrateExport")
  197. return databaseMigrateExportRes, err
  198. }
  199. //DatabaseMigrateQueryInfo 数据库迁移状态查询
  200. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseMigrateQueryInfo.html
  201. func (tcb *Tcb) DatabaseMigrateQueryInfo(env string, jobID int64) (*DatabaseMigrateQueryInfoRes, error) {
  202. accessToken, err := tcb.GetAccessToken()
  203. if err != nil {
  204. return nil, err
  205. }
  206. uri := fmt.Sprintf("%s?access_token=%s", databaseMigrateQueryInfoURL, accessToken)
  207. response, err := util.PostJSON(uri, map[string]interface{}{
  208. "env": env,
  209. "job_id": jobID,
  210. })
  211. if err != nil {
  212. return nil, err
  213. }
  214. databaseMigrateQueryInfoRes := &DatabaseMigrateQueryInfoRes{}
  215. err = util.DecodeWithError(response, databaseMigrateQueryInfoRes, "DatabaseMigrateQueryInfo")
  216. return databaseMigrateQueryInfoRes, err
  217. }
  218. //UpdateIndex 变更数据库索引
  219. //https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/updateIndex.html
  220. func (tcb *Tcb) UpdateIndex(req *UpdateIndexReq) error {
  221. accessToken, err := tcb.GetAccessToken()
  222. if err != nil {
  223. return err
  224. }
  225. uri := fmt.Sprintf("%s?access_token=%s", updateIndexURL, accessToken)
  226. response, err := util.PostJSON(uri, req)
  227. if err != nil {
  228. return err
  229. }
  230. return util.DecodeWithCommonError(response, "UpdateIndex")
  231. }
  232. //DatabaseCollectionAdd 新增集合
  233. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionAdd.html
  234. func (tcb *Tcb) DatabaseCollectionAdd(env, collectionName string) error {
  235. accessToken, err := tcb.GetAccessToken()
  236. if err != nil {
  237. return err
  238. }
  239. uri := fmt.Sprintf("%s?access_token=%s", databaseCollectionAddURL, accessToken)
  240. response, err := util.PostJSON(uri, &DatabaseCollectionReq{
  241. Env: env,
  242. CollectionName: collectionName,
  243. })
  244. if err != nil {
  245. return err
  246. }
  247. return util.DecodeWithCommonError(response, "DatabaseCollectionAdd")
  248. }
  249. //DatabaseCollectionDelete 删除集合
  250. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionDelete.html
  251. func (tcb *Tcb) DatabaseCollectionDelete(env, collectionName string) error {
  252. accessToken, err := tcb.GetAccessToken()
  253. if err != nil {
  254. return err
  255. }
  256. uri := fmt.Sprintf("%s?access_token=%s", databaseCollectionDeleteURL, accessToken)
  257. response, err := util.PostJSON(uri, &DatabaseCollectionReq{
  258. Env: env,
  259. CollectionName: collectionName,
  260. })
  261. if err != nil {
  262. return err
  263. }
  264. return util.DecodeWithCommonError(response, "DatabaseCollectionDelete")
  265. }
  266. //DatabaseCollectionGet 获取特定云环境下集合信息
  267. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCollectionGet.html
  268. func (tcb *Tcb) DatabaseCollectionGet(env string, limit, offset int64) (*DatabaseCollectionGetRes, error) {
  269. accessToken, err := tcb.GetAccessToken()
  270. if err != nil {
  271. return nil, err
  272. }
  273. uri := fmt.Sprintf("%s?access_token=%s", databaseCollectionGetURL, accessToken)
  274. response, err := util.PostJSON(uri, &DatabaseCollectionGetReq{
  275. Env: env,
  276. Limit: limit,
  277. Offset: offset,
  278. })
  279. if err != nil {
  280. return nil, err
  281. }
  282. databaseCollectionGetRes := &DatabaseCollectionGetRes{}
  283. err = util.DecodeWithError(response, databaseCollectionGetRes, "DatabaseCollectionGet")
  284. return databaseCollectionGetRes, err
  285. }
  286. //DatabaseAdd 数据库插入记录
  287. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseAdd.html
  288. func (tcb *Tcb) DatabaseAdd(env, query string) (*DatabaseAddRes, error) {
  289. accessToken, err := tcb.GetAccessToken()
  290. if err != nil {
  291. return nil, err
  292. }
  293. uri := fmt.Sprintf("%s?access_token=%s", databaseAddURL, accessToken)
  294. response, err := util.PostJSON(uri, &DatabaseReq{
  295. Env: env,
  296. Query: query,
  297. })
  298. if err != nil {
  299. return nil, err
  300. }
  301. databaseAddRes := &DatabaseAddRes{}
  302. err = util.DecodeWithError(response, databaseAddRes, "DatabaseAdd")
  303. return databaseAddRes, err
  304. }
  305. //DatabaseDelete 数据库插入记录
  306. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseDelete.html
  307. func (tcb *Tcb) DatabaseDelete(env, query string) (*DatabaseDeleteRes, error) {
  308. accessToken, err := tcb.GetAccessToken()
  309. if err != nil {
  310. return nil, err
  311. }
  312. uri := fmt.Sprintf("%s?access_token=%s", databaseDeleteURL, accessToken)
  313. response, err := util.PostJSON(uri, &DatabaseReq{
  314. Env: env,
  315. Query: query,
  316. })
  317. if err != nil {
  318. return nil, err
  319. }
  320. databaseDeleteRes := &DatabaseDeleteRes{}
  321. err = util.DecodeWithError(response, databaseDeleteRes, "DatabaseDelete")
  322. return databaseDeleteRes, err
  323. }
  324. //DatabaseUpdate 数据库插入记录
  325. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseUpdate.html
  326. func (tcb *Tcb) DatabaseUpdate(env, query string) (*DatabaseUpdateRes, error) {
  327. accessToken, err := tcb.GetAccessToken()
  328. if err != nil {
  329. return nil, err
  330. }
  331. uri := fmt.Sprintf("%s?access_token=%s", databaseUpdateURL, accessToken)
  332. response, err := util.PostJSON(uri, &DatabaseReq{
  333. Env: env,
  334. Query: query,
  335. })
  336. if err != nil {
  337. return nil, err
  338. }
  339. databaseUpdateRes := &DatabaseUpdateRes{}
  340. err = util.DecodeWithError(response, databaseUpdateRes, "DatabaseUpdate")
  341. return databaseUpdateRes, err
  342. }
  343. //DatabaseQuery 数据库查询记录
  344. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseQuery.html
  345. func (tcb *Tcb) DatabaseQuery(env, query string) (*DatabaseQueryRes, error) {
  346. accessToken, err := tcb.GetAccessToken()
  347. if err != nil {
  348. return nil, err
  349. }
  350. uri := fmt.Sprintf("%s?access_token=%s", databaseQueryURL, accessToken)
  351. response, err := util.PostJSON(uri, &DatabaseReq{
  352. Env: env,
  353. Query: query,
  354. })
  355. if err != nil {
  356. return nil, err
  357. }
  358. databaseQueryRes := &DatabaseQueryRes{}
  359. err = util.DecodeWithError(response, databaseQueryRes, "DatabaseQuery")
  360. return databaseQueryRes, err
  361. }
  362. //DatabaseCount 统计集合记录数或统计查询语句对应的结果记录数
  363. //reference:https://developers.weixin.qq.com/miniprogram/dev/wxcloud/reference-http-api/database/databaseCount.html
  364. func (tcb *Tcb) DatabaseCount(env, query string) (*DatabaseCountRes, error) {
  365. accessToken, err := tcb.GetAccessToken()
  366. if err != nil {
  367. return nil, err
  368. }
  369. uri := fmt.Sprintf("%s?access_token=%s", databaseCountURL, accessToken)
  370. response, err := util.PostJSON(uri, &DatabaseReq{
  371. Env: env,
  372. Query: query,
  373. })
  374. if err != nil {
  375. return nil, err
  376. }
  377. databaseCountRes := &DatabaseCountRes{}
  378. err = util.DecodeWithError(response, databaseCountRes, "DatabaseCount")
  379. return databaseCountRes, err
  380. }