osm_sdk.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648
  1. package osm_sdk
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "git.sxidc.com/go-framework/baize/framework/core/api/response"
  6. "git.sxidc.com/go-tools/utils/strutils"
  7. "git.sxidc.com/service-supports/dapr_api/invoke"
  8. "github.com/pkg/errors"
  9. "io"
  10. "mime/multipart"
  11. "time"
  12. )
  13. const TimeoutSec = 30
  14. const servicePrefix = "/osm/api/v1"
  15. var prefix string
  16. var namespace string
  17. var name string
  18. var invokeAPI *invoke.API
  19. type (
  20. ConfigKey struct {
  21. Namespace string `json:"namespace" form:"namespace" binding:"required"`
  22. Name string `json:"name" form:"name" binding:"required"`
  23. }
  24. DeleteMultiObjJsonBody struct {
  25. ConfigKey
  26. ObjNames []string `json:"objNames" binding:"required"`
  27. Prefix string `json:"prefix"`
  28. }
  29. CopyJsonBody struct {
  30. ConfigKey
  31. SrcObjName string `json:"srcObjName" binding:"required"`
  32. DstObjName string `json:"dstObjName" binding:"required"`
  33. RequireInfos []string `json:"requireInfos"`
  34. Prefix string `json:"prefix"`
  35. }
  36. MoveJsonBody struct {
  37. ConfigKey
  38. SrcObjName string `json:"srcObjName" binding:"required"`
  39. DstObjName string `json:"dstObjName" binding:"required"`
  40. RequireInfos []string `json:"requireInfos"`
  41. Prefix string `json:"prefix"`
  42. }
  43. ZoomUrlJsonBody struct {
  44. ConfigKey
  45. ObjName string `json:"srcObjName" binding:"required"`
  46. Process string `json:"dstObjName" binding:"required"`
  47. RequireInfos []string `json:"requireInfos"`
  48. Prefix string `json:"prefix"`
  49. }
  50. )
  51. func Destroy() {
  52. if invokeAPI == nil {
  53. return
  54. }
  55. invoke.DestroyAPI(invokeAPI)
  56. invokeAPI = nil
  57. }
  58. func Init(configPrefix, configNamespace, configName, baseUrl string) error {
  59. prefix = configPrefix
  60. namespace = configNamespace
  61. name = configName
  62. if invokeAPI == nil {
  63. invokeAPI = invoke.NewAPI(baseUrl, TimeoutSec*time.Second)
  64. }
  65. return nil
  66. }
  67. //func Touch(reader io.Reader, to string) error {
  68. // return TouchPrefix(reader, to, true)
  69. //}
  70. //func TouchPrefix(reader io.Reader, to string, addPfx bool) error {
  71. // if addPfx {
  72. // return Bkt.PutObject(prefix+to, reader)
  73. // }
  74. // return Bkt.PutObject(to, reader)
  75. //}
  76. func GetUrl(objName string) (string, error) {
  77. return getUrl(objName)
  78. }
  79. func GetUrlWithPrefix(objName string) (string, error) {
  80. return getUrl(prefix + objName)
  81. }
  82. func getUrl(objName string) (string, error) {
  83. if strutils.IsStringEmpty(objName) {
  84. return "", nil
  85. }
  86. responseBytes, err := invokeAPI.GetWithoutHeaders(servicePrefix+"/operation/url/get", map[string]string{
  87. "namespace": namespace,
  88. "name": name,
  89. "objName": objName,
  90. })
  91. if err != nil {
  92. return "", err
  93. }
  94. resp := new(response.InfoResponse[string])
  95. err = json.Unmarshal(responseBytes, resp)
  96. if err != nil {
  97. return "", err
  98. }
  99. if !resp.Success {
  100. return "", errors.New(resp.Msg)
  101. }
  102. return resp.Info, nil
  103. }
  104. //func ZoomUrl(obj, s string) (string, error) {
  105. // if strutils.HasBlank(obj) {
  106. // log.Println("oss发现违规参数")
  107. // return "", nil
  108. // }
  109. // return Bkt.SignURL(prefix+obj, oss.HTTPGet, 60, oss.Process(s))
  110. //}
  111. //
  112. //func ZoomUrlPfx(obj, s string, addPfx bool) (string, error) {
  113. // if strutils.HasBlank(obj) {
  114. // log.Println("oss发现违规参数")
  115. // return "", nil
  116. // }
  117. //
  118. // if addPfx {
  119. // return Bkt.SignURL(prefix+obj, oss.HTTPGet, 60, oss.Process(s))
  120. // }
  121. //
  122. // return Bkt.SignURL(obj, oss.HTTPGet, 60, oss.Process(s))
  123. //
  124. //}
  125. func ZoomUrl(objName, profess string) (string, error) {
  126. return zoomUrl(objName, profess)
  127. }
  128. func ZoomUrlWithPrefix(objName, profess string) (string, error) {
  129. return zoomUrl(prefix+objName, profess)
  130. }
  131. func zoomUrl(objName, process string) (string, error) {
  132. if strutils.IsStringEmpty(objName) {
  133. return "", nil
  134. }
  135. requestJson, err := json.Marshal(ZoomUrlJsonBody{
  136. ConfigKey: ConfigKey{
  137. Namespace: namespace,
  138. Name: name,
  139. },
  140. ObjName: objName,
  141. Process: process,
  142. RequireInfos: nil,
  143. })
  144. if err != nil {
  145. return "", err
  146. }
  147. responseBytes, err := invokeAPI.PostJSON(servicePrefix+"/operation/obj/zoomUrl", requestJson, nil)
  148. if err != nil {
  149. return "", err
  150. }
  151. resp := new(response.InfoResponse[string])
  152. err = json.Unmarshal(responseBytes, resp)
  153. if err != nil {
  154. return "", err
  155. }
  156. if !resp.Success {
  157. return "", errors.New(resp.Msg)
  158. }
  159. return resp.Info, nil
  160. }
  161. //func Exist(obj string) (bool, error) {
  162. // if strutils.HasBlank(obj) {
  163. // return false, nil
  164. // }
  165. //
  166. // return Bkt.IsObjectExist(prefix + obj)
  167. //}
  168. func Exist(objName string) (bool, error) {
  169. return exist(objName)
  170. }
  171. func ExistWithPrefix(objName string) (bool, error) {
  172. return exist(prefix + objName)
  173. }
  174. func exist(objName string) (bool, error) {
  175. if strutils.IsStringEmpty(objName) {
  176. return false, nil
  177. }
  178. responseBytes, err := invokeAPI.GetWithoutHeaders(servicePrefix+"/operation/obj/check", map[string]string{
  179. "namespace": namespace,
  180. "name": name,
  181. "objName": objName,
  182. })
  183. if err != nil {
  184. return false, err
  185. }
  186. resp := new(response.InfoResponse[bool])
  187. err = json.Unmarshal(responseBytes, resp)
  188. if err != nil {
  189. return false, err
  190. }
  191. if !resp.Success {
  192. return false, errors.New(resp.Msg)
  193. }
  194. return true, nil
  195. }
  196. func DeleteMulti(objNames ...string) error {
  197. return deleteMulti(objNames...)
  198. }
  199. func DeleteMultiWithPrefix(userId string, objNames ...string) error {
  200. for _, objName := range objNames {
  201. objName = prefix + objName
  202. }
  203. return deleteMulti(objNames...)
  204. }
  205. func deleteMulti(objNames ...string) error {
  206. if len(objNames) == 0 {
  207. return nil
  208. }
  209. requestJson, err := json.Marshal(DeleteMultiObjJsonBody{
  210. ConfigKey: ConfigKey{
  211. Namespace: namespace,
  212. Name: name,
  213. },
  214. Prefix: prefix,
  215. ObjNames: objNames,
  216. })
  217. if err != nil {
  218. return err
  219. }
  220. responseBytes, err := invokeAPI.PostJSON(servicePrefix+"/operation/obj/deleteMulti", requestJson, nil)
  221. if err != nil {
  222. return err
  223. }
  224. resp := new(response.MsgResponse)
  225. err = json.Unmarshal(responseBytes, resp)
  226. if err != nil {
  227. return err
  228. }
  229. if !resp.Success {
  230. return errors.New(resp.Msg)
  231. }
  232. return nil
  233. }
  234. func ListDir(dirPath string) ([]string, error) {
  235. return listDir(dirPath)
  236. }
  237. func ListDirWithPrefix(dirPath string) ([]string, error) {
  238. return listDir(prefix + dirPath)
  239. }
  240. func listDir(dirPath string) ([]string, error) {
  241. if strutils.IsStringEmpty(dirPath) {
  242. return nil, nil
  243. }
  244. responseBytes, err := invokeAPI.GetWithoutHeaders(servicePrefix+"/operation/objPath/list", map[string]string{
  245. "namespace": namespace,
  246. "name": name,
  247. "dirPath": dirPath,
  248. })
  249. if err != nil {
  250. return nil, err
  251. }
  252. resp := new(response.InfoResponse[[]string])
  253. err = json.Unmarshal(responseBytes, resp)
  254. if err != nil {
  255. return nil, err
  256. }
  257. if !resp.Success {
  258. return nil, errors.New(resp.Msg)
  259. }
  260. return resp.Info, nil
  261. }
  262. func LsDetails(dirPath string) ([]ObjectInfo, error) {
  263. return lsDetails(dirPath)
  264. }
  265. func LsDetailsWithPrefix(dirPath string) ([]ObjectInfo, error) {
  266. return lsDetails(prefix + dirPath)
  267. }
  268. type ObjectInfo struct {
  269. Key string
  270. Type string
  271. Size int64
  272. }
  273. func lsDetails(dirPath string) ([]ObjectInfo, error) {
  274. if strutils.IsStringEmpty(dirPath) {
  275. return []ObjectInfo{}, nil
  276. }
  277. responseBytes, err := invokeAPI.GetWithoutHeaders(servicePrefix+"/operation/objPath/listDetail", map[string]string{
  278. "namespace": namespace,
  279. "name": name,
  280. "dirPath": dirPath,
  281. })
  282. if err != nil {
  283. return nil, err
  284. }
  285. resp := new(response.InfoResponse[[]ObjectInfo])
  286. err = json.Unmarshal(responseBytes, resp)
  287. if err != nil {
  288. return nil, err
  289. }
  290. if !resp.Success {
  291. return nil, errors.New(resp.Msg)
  292. }
  293. return resp.Info, nil
  294. }
  295. //func Mv(f, t string) error {
  296. // if err := Cp(f, t); err != nil {
  297. // return err
  298. // }
  299. //
  300. // return Bkt.DeleteObject(prefix + f)
  301. //}
  302. func Move(srcObjName, dstObjName string) error {
  303. return move(srcObjName, dstObjName, nil)
  304. }
  305. func MoveWithPrefix(srcObjName, dstObjName string) error {
  306. return move(prefix+srcObjName, prefix+dstObjName, nil)
  307. }
  308. func move(srcObjName, dstObjName string, requireInfos []string) error {
  309. if strutils.IsStringEmpty(srcObjName) {
  310. return nil
  311. }
  312. if strutils.IsStringEmpty(dstObjName) {
  313. return nil
  314. }
  315. requestJson, err := json.Marshal(MoveJsonBody{
  316. ConfigKey: ConfigKey{
  317. Namespace: namespace,
  318. Name: name,
  319. },
  320. SrcObjName: srcObjName,
  321. DstObjName: dstObjName,
  322. RequireInfos: requireInfos,
  323. Prefix: prefix,
  324. })
  325. if err != nil {
  326. return err
  327. }
  328. responseBytes, err := invokeAPI.PutJSON(servicePrefix+"/operation/obj/move", requestJson, nil)
  329. if err != nil {
  330. return err
  331. }
  332. resp := new(response.InfoResponse[any])
  333. err = json.Unmarshal(responseBytes, resp)
  334. if err != nil {
  335. return err
  336. }
  337. if !resp.Success {
  338. return errors.New(resp.Msg)
  339. }
  340. return nil
  341. }
  342. //func CpOrigin(f, t string) error {
  343. // _, err := Bkt.CopyObject(f, t)
  344. // return err
  345. //}
  346. func Copy(srcObjName, dstObjName string) error {
  347. return copying(srcObjName, dstObjName, nil)
  348. }
  349. func CopyWithPrefix(srcObjName, dstObjName string) error {
  350. return copying(prefix+srcObjName, prefix+dstObjName, nil)
  351. }
  352. func copying(srcObjName, dstObjName string, requireInfos []string) error {
  353. if strutils.IsStringEmpty(srcObjName) {
  354. return nil
  355. }
  356. if strutils.IsStringEmpty(dstObjName) {
  357. return nil
  358. }
  359. requestJson, err := json.Marshal(CopyJsonBody{
  360. ConfigKey: ConfigKey{
  361. Namespace: namespace,
  362. Name: name,
  363. },
  364. SrcObjName: srcObjName,
  365. DstObjName: dstObjName,
  366. RequireInfos: requireInfos,
  367. Prefix: prefix,
  368. })
  369. if err != nil {
  370. return err
  371. }
  372. responseBytes, err := invokeAPI.PostJSON(servicePrefix+"/operation/obj/copy", requestJson, nil)
  373. if err != nil {
  374. return err
  375. }
  376. resp := new(response.InfoResponse[any])
  377. err = json.Unmarshal(responseBytes, resp)
  378. if err != nil {
  379. return err
  380. }
  381. if !resp.Success {
  382. return errors.New(resp.Msg)
  383. }
  384. return nil
  385. }
  386. func CopyPublic(srcObjName, dstObjName string) error {
  387. return copyPublic(srcObjName, dstObjName, nil)
  388. }
  389. func CopyPublicWithPrefix(srcObjName, dstObjName string) error {
  390. return copyPublic(prefix+srcObjName, prefix+dstObjName, nil)
  391. }
  392. func copyPublic(srcObjName, dstObjName string, requireInfos []string) error {
  393. if strutils.IsStringEmpty(srcObjName) {
  394. return nil
  395. }
  396. if strutils.IsStringEmpty(dstObjName) {
  397. return nil
  398. }
  399. requestJson, err := json.Marshal(CopyJsonBody{
  400. ConfigKey: ConfigKey{
  401. Namespace: namespace,
  402. Name: name,
  403. },
  404. SrcObjName: srcObjName,
  405. DstObjName: dstObjName,
  406. RequireInfos: requireInfos,
  407. Prefix: prefix,
  408. })
  409. if err != nil {
  410. return err
  411. }
  412. responseBytes, err := invokeAPI.PostJSON(servicePrefix+"/operation/obj/copyPublic", requestJson, nil)
  413. if err != nil {
  414. return err
  415. }
  416. resp := new(response.InfoResponse[any])
  417. err = json.Unmarshal(responseBytes, resp)
  418. if err != nil {
  419. return err
  420. }
  421. if !resp.Success {
  422. return errors.New(resp.Msg)
  423. }
  424. return nil
  425. }
  426. func CreateImage(reader io.Reader, objName string) (string, error) {
  427. return createImage(reader, objName)
  428. }
  429. func CreateImageWithPrefix(reader io.Reader, objName string) (string, error) {
  430. return createImage(reader, prefix+objName)
  431. }
  432. func createImage(reader io.Reader, objName string) (string, error) {
  433. if strutils.IsStringEmpty(objName) {
  434. return "", nil
  435. }
  436. bodyBuffer := &bytes.Buffer{}
  437. multipartWriter := multipart.NewWriter(bodyBuffer)
  438. // 添加字段
  439. fieldWriter, err := multipartWriter.CreateFormField("objName")
  440. if err != nil {
  441. return "", err
  442. }
  443. _, err = fieldWriter.Write([]byte(objName))
  444. if err != nil {
  445. return "", err
  446. }
  447. // 添加文件
  448. fileWriter, err := multipartWriter.CreateFormFile("file", objName)
  449. if err != nil {
  450. return "", err
  451. }
  452. _, err = io.Copy(fileWriter, reader)
  453. if err != nil {
  454. return "", err
  455. }
  456. bodyByte, err := io.ReadAll(bodyBuffer)
  457. if err != nil {
  458. return "", err
  459. }
  460. responseBytes, err := invokeAPI.Post(servicePrefix+"/operation/obj/create/image", map[string]string{
  461. "Content-Type": multipartWriter.FormDataContentType()}, bodyByte)
  462. if err != nil {
  463. return "", err
  464. }
  465. resp := new(response.InfoResponse[string])
  466. err = json.Unmarshal(responseBytes, resp)
  467. if err != nil {
  468. return "", err
  469. }
  470. if !resp.Success {
  471. return "", errors.New(resp.Msg)
  472. }
  473. return resp.Info, nil
  474. }
  475. //func Cp(f, t string) error {
  476. // return CpOrigin(prefix+f, prefix+t)
  477. //}
  478. //
  479. //func TouchFormatImg(reader io.Reader, to string) error {
  480. // if reader == nil || strutils.HasBlank(to) {
  481. // log.Println("oss上传发现违规参数")
  482. // return nil
  483. // }
  484. //
  485. // return Bkt.PutObject(prefix+to, reader, oss.ContentType("image/jpg"))
  486. //}
  487. //func GetObjectBytes(obj string) ([]byte, error) {
  488. // if strutils.HasBlank(obj) {
  489. // return nil, errors.New("参数错误")
  490. // }
  491. // buf := new(bytes.Buffer)
  492. // body, err := Bkt.GetObject(prefix + obj)
  493. // if err != nil {
  494. // return nil, err
  495. // }
  496. // _, err = io.Copy(buf, body)
  497. // if err != nil {
  498. // return nil, err
  499. // }
  500. // err = body.Close()
  501. // if err != nil {
  502. // return nil, err
  503. // }
  504. //
  505. // return buf.Bytes(), nil
  506. //}
  507. //func getObjectBytes(objName, userId string) ([]byte, error) {
  508. // if strutils.IsStringEmpty(objName) {
  509. // return nil, nil
  510. // }
  511. // if strutils.IsStringEmpty(objName) {
  512. // return nil, nil
  513. // }
  514. // buf := new(bytes.Buffer)
  515. //
  516. // responseBytes, err := invokeAPI.GetWithoutHeaders(servicePrefix+"/operation/obj/getContent", map[string]string{
  517. // "namespace": namespace,
  518. // "name": name,
  519. // "objName": objName,
  520. // "userId": userId,
  521. // })
  522. // if err != nil {
  523. // return nil, err
  524. // }
  525. //
  526. // resp := new(response.InfoResponse[[]byte])
  527. // err = json.Unmarshal(responseBytes, resp)
  528. // if err != nil {
  529. // return nil, err
  530. // }
  531. //
  532. // if !resp.Success {
  533. // return nil, errors.New(resp.Msg)
  534. // }
  535. //
  536. // //return resp.Info, nil
  537. // _, err = io.Copy(buf, resp.Info)
  538. // if err != nil {
  539. // return nil, err
  540. // }
  541. // err = body.Close()
  542. // if err != nil {
  543. // return nil, err
  544. // }
  545. //
  546. // return buf.Bytes(), nil
  547. //}
  548. //func MvWithoutPrefix(f, t string) error {
  549. // if _, err := Bkt.CopyObject(f, t); err != nil {
  550. // return err
  551. // }
  552. //
  553. // return Bkt.DeleteObject(f)
  554. //}