oauth.go 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307
  1. package admin
  2. import (
  3. "Gwen/global"
  4. "Gwen/http/request/admin"
  5. adminReq "Gwen/http/request/admin"
  6. "Gwen/http/response"
  7. "Gwen/model"
  8. "Gwen/service"
  9. "github.com/gin-gonic/gin"
  10. "strconv"
  11. )
  12. type Oauth struct {
  13. }
  14. // Info
  15. func (o *Oauth) Info(c *gin.Context) {
  16. code := c.Query("code")
  17. if code == "" {
  18. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
  19. return
  20. }
  21. v := service.AllService.OauthService.GetOauthCache(code)
  22. if v == nil {
  23. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  24. return
  25. }
  26. response.Success(c, v)
  27. }
  28. func (o *Oauth) ToBind(c *gin.Context) {
  29. f := &adminReq.BindOauthForm{}
  30. err := c.ShouldBindJSON(f)
  31. if err != nil {
  32. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  33. return
  34. }
  35. u := service.AllService.UserService.CurUser(c)
  36. utr := service.AllService.UserService.UserThirdInfo(u.Id, f.Op)
  37. if utr.Id > 0 {
  38. response.Fail(c, 101, response.TranslateMsg(c, "OauthHasBindOtherUser"))
  39. return
  40. }
  41. err, code, url := service.AllService.OauthService.BeginAuth(f.Op)
  42. if err != nil {
  43. response.Error(c, response.TranslateMsg(c, err.Error()))
  44. return
  45. }
  46. service.AllService.OauthService.SetOauthCache(code, &service.OauthCacheItem{
  47. Action: service.OauthActionTypeBind,
  48. Op: f.Op,
  49. UserId: u.Id,
  50. }, 5*60)
  51. response.Success(c, gin.H{
  52. "code": code,
  53. "url": url,
  54. })
  55. }
  56. // Confirm 确认授权登录
  57. func (o *Oauth) Confirm(c *gin.Context) {
  58. j := &adminReq.OauthConfirmForm{}
  59. err := c.ShouldBindJSON(j)
  60. if err != nil {
  61. response.Fail(c, 101, "参数错误"+err.Error())
  62. return
  63. }
  64. if j.Code == "" {
  65. response.Fail(c, 101, "参数错误: code 不存在")
  66. return
  67. }
  68. v := service.AllService.OauthService.GetOauthCache(j.Code)
  69. if v == nil {
  70. response.Fail(c, 101, "授权已过期")
  71. return
  72. }
  73. u := service.AllService.UserService.CurUser(c)
  74. v.UserId = u.Id
  75. service.AllService.OauthService.SetOauthCache(j.Code, v, 0)
  76. response.Success(c, v)
  77. }
  78. func (o *Oauth) BindConfirm(c *gin.Context) {
  79. j := &adminReq.OauthConfirmForm{}
  80. err := c.ShouldBindJSON(j)
  81. if err != nil {
  82. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  83. return
  84. }
  85. if j.Code == "" {
  86. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
  87. return
  88. }
  89. v := service.AllService.OauthService.GetOauthCache(j.Code)
  90. if v == nil {
  91. response.Fail(c, 101, response.TranslateMsg(c, "OauthExpired"))
  92. return
  93. }
  94. u := service.AllService.UserService.CurUser(c)
  95. err = service.AllService.OauthService.BindGithubUser(v.ThirdOpenId, v.ThirdOpenId, u.Id)
  96. if err != nil {
  97. response.Fail(c, 101, response.TranslateMsg(c, "BindFail"))
  98. return
  99. }
  100. v.UserId = u.Id
  101. service.AllService.OauthService.SetOauthCache(j.Code, v, 0)
  102. response.Success(c, v)
  103. }
  104. func (o *Oauth) Unbind(c *gin.Context) {
  105. f := &adminReq.UnBindOauthForm{}
  106. err := c.ShouldBindJSON(f)
  107. if err != nil {
  108. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  109. return
  110. }
  111. u := service.AllService.UserService.CurUser(c)
  112. utr := service.AllService.UserService.UserThirdInfo(u.Id, f.Op)
  113. if utr.Id == 0 {
  114. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  115. return
  116. }
  117. if f.Op == model.OauthTypeGithub {
  118. err = service.AllService.OauthService.UnBindGithubUser(u.Id)
  119. if err != nil {
  120. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  121. return
  122. }
  123. }
  124. if f.Op == model.OauthTypeGoogle {
  125. err = service.AllService.OauthService.UnBindGoogleUser(u.Id)
  126. if err != nil {
  127. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  128. return
  129. }
  130. }
  131. if f.Op == model.OauthTypeOidc {
  132. err = service.AllService.OauthService.UnBindOidcUser(u.Id)
  133. if err != nil {
  134. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  135. return
  136. }
  137. }
  138. response.Success(c, nil)
  139. }
  140. // Detail Oauth
  141. // @Tags Oauth
  142. // @Summary Oauth详情
  143. // @Description Oauth详情
  144. // @Accept json
  145. // @Produce json
  146. // @Param id path int true "ID"
  147. // @Success 200 {object} response.Response{data=model.Oauth}
  148. // @Failure 500 {object} response.Response
  149. // @Router /admin/oauth/detail/{id} [get]
  150. // @Security token
  151. func (o *Oauth) Detail(c *gin.Context) {
  152. id := c.Param("id")
  153. iid, _ := strconv.Atoi(id)
  154. u := service.AllService.OauthService.InfoById(uint(iid))
  155. if u.Id > 0 {
  156. response.Success(c, u)
  157. return
  158. }
  159. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  160. return
  161. }
  162. // Create 创建Oauth
  163. // @Tags Oauth
  164. // @Summary 创建Oauth
  165. // @Description 创建Oauth
  166. // @Accept json
  167. // @Produce json
  168. // @Param body body admin.OauthForm true "Oauth信息"
  169. // @Success 200 {object} response.Response{data=model.Oauth}
  170. // @Failure 500 {object} response.Response
  171. // @Router /admin/oauth/create [post]
  172. // @Security token
  173. func (o *Oauth) Create(c *gin.Context) {
  174. f := &admin.OauthForm{}
  175. if err := c.ShouldBindJSON(f); err != nil {
  176. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  177. return
  178. }
  179. errList := global.Validator.ValidStruct(c, f)
  180. if len(errList) > 0 {
  181. response.Fail(c, 101, errList[0])
  182. return
  183. }
  184. ex := service.AllService.OauthService.InfoByOp(f.Op)
  185. if ex.Id > 0 {
  186. response.Fail(c, 101, response.TranslateMsg(c, "ItemExists"))
  187. return
  188. }
  189. u := f.ToOauth()
  190. err := service.AllService.OauthService.Create(u)
  191. if err != nil {
  192. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  193. return
  194. }
  195. response.Success(c, nil)
  196. }
  197. // List 列表
  198. // @Tags Oauth
  199. // @Summary Oauth列表
  200. // @Description Oauth列表
  201. // @Accept json
  202. // @Produce json
  203. // @Param page query int false "页码"
  204. // @Param page_size query int false "页大小"
  205. // @Success 200 {object} response.Response{data=model.OauthList}
  206. // @Failure 500 {object} response.Response
  207. // @Router /admin/oauth/list [get]
  208. // @Security token
  209. func (o *Oauth) List(c *gin.Context) {
  210. query := &admin.PageQuery{}
  211. if err := c.ShouldBindQuery(query); err != nil {
  212. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  213. return
  214. }
  215. res := service.AllService.OauthService.List(query.Page, query.PageSize, nil)
  216. response.Success(c, res)
  217. }
  218. // Update 编辑
  219. // @Tags Oauth
  220. // @Summary Oauth编辑
  221. // @Description Oauth编辑
  222. // @Accept json
  223. // @Produce json
  224. // @Param body body admin.OauthForm true "Oauth信息"
  225. // @Success 200 {object} response.Response{data=model.OauthList}
  226. // @Failure 500 {object} response.Response
  227. // @Router /admin/oauth/update [post]
  228. // @Security token
  229. func (o *Oauth) Update(c *gin.Context) {
  230. f := &admin.OauthForm{}
  231. if err := c.ShouldBindJSON(f); err != nil {
  232. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  233. return
  234. }
  235. if f.Id == 0 {
  236. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError"))
  237. return
  238. }
  239. errList := global.Validator.ValidStruct(c, f)
  240. if len(errList) > 0 {
  241. response.Fail(c, 101, errList[0])
  242. return
  243. }
  244. u := f.ToOauth()
  245. err := service.AllService.OauthService.Update(u)
  246. if err != nil {
  247. response.Fail(c, 101, response.TranslateMsg(c, "OperationFailed")+err.Error())
  248. return
  249. }
  250. response.Success(c, nil)
  251. }
  252. // Delete 删除
  253. // @Tags Oauth
  254. // @Summary Oauth删除
  255. // @Description Oauth删除
  256. // @Accept json
  257. // @Produce json
  258. // @Param body body admin.OauthForm true "Oauth信息"
  259. // @Success 200 {object} response.Response
  260. // @Failure 500 {object} response.Response
  261. // @Router /admin/oauth/delete [post]
  262. // @Security token
  263. func (o *Oauth) Delete(c *gin.Context) {
  264. f := &admin.OauthForm{}
  265. if err := c.ShouldBindJSON(f); err != nil {
  266. response.Fail(c, 101, response.TranslateMsg(c, "ParamsError")+err.Error())
  267. return
  268. }
  269. id := f.Id
  270. errList := global.Validator.ValidVar(c, id, "required,gt=0")
  271. if len(errList) > 0 {
  272. response.Fail(c, 101, errList[0])
  273. return
  274. }
  275. u := service.AllService.OauthService.InfoById(f.Id)
  276. if u.Id > 0 {
  277. err := service.AllService.OauthService.Delete(u)
  278. if err == nil {
  279. response.Success(c, nil)
  280. return
  281. }
  282. response.Fail(c, 101, err.Error())
  283. return
  284. }
  285. response.Fail(c, 101, response.TranslateMsg(c, "ItemNotFound"))
  286. }