database.go 15 KB

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