user.go 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. package example_test
  2. import (
  3. "bytes"
  4. "fmt"
  5. "io"
  6. "log"
  7. "strings"
  8. "git.ali33.ru/fcg-xvii/go-tools/json"
  9. "git.ali33.ru/fcg-xvii/rest"
  10. )
  11. type ExampleUser struct {
  12. ID int64 `rest:"default"`
  13. Name string `rest:"default"`
  14. password string
  15. Group *ExampleGroup
  16. Avatar []byte `rest:"ignore"`
  17. }
  18. func (s *ExampleUser) RestFields(result json.Map, files map[string]io.ReadCloser, names rest.FieldList) {
  19. if _, check := names.Field("avatar"); check {
  20. if len(s.Avatar) == 0 {
  21. result["avatar"] = nil
  22. } else {
  23. fName := fmt.Sprintf("user%v.avatar.jpg", s.ID)
  24. result["avatar"] = fName
  25. log.Println("--------------------------->", s.Avatar)
  26. files[fName] = io.NopCloser(bytes.NewReader(s.Avatar))
  27. }
  28. }
  29. }
  30. // Register ////////////////////////////////////////////
  31. type ExampleRequestRegister struct {
  32. ID int64
  33. Name string `rest:"required"`
  34. Password string `rest:"required"`
  35. GroupID int64 `rest:"required"`
  36. // Объект группы, который определяется в валидации.
  37. // В боевых условиях это поле должно быть приватное.
  38. group *ExampleGroup
  39. }
  40. func (s *ExampleRequestRegister) Validate(req rest.IRequestIn) rest.IRequestOut {
  41. // пользователь не должен быть авторизован
  42. if req.Auth() != nil {
  43. return req.OutError(rest.ErrorMessage("AlreadyAuthorized", "User is already authorized"))
  44. }
  45. // проверяем имя
  46. if s.Name = strings.TrimSpace(s.Name); len(s.Name) == 0 {
  47. return req.OutError(rest.ErrorFiled("name", "expected not empty string"))
  48. }
  49. // проверяем пароль
  50. if len(s.Password) < 3 {
  51. return req.OutError(rest.ErrorFiled("password", "expected minimum 3 symbols"))
  52. }
  53. // вилидируем группу
  54. group, check := App.groups.Load(s.GroupID)
  55. if !check {
  56. return req.OutError(rest.ErrorMessage("GroupNotFound", "Group is not found"))
  57. }
  58. // Устанавливаем группу для использования в методе выполняния,
  59. // чтобы не выбирать её снова
  60. s.group = group.(*ExampleGroup)
  61. return nil
  62. }
  63. func (s *ExampleRequestRegister) Execute(req rest.IRequestIn) rest.IRequestOut {
  64. return req.OutError(rest.ErrorMessage("!!!", "..."))
  65. // создаем нового юзера
  66. userID := App.GenerateID()
  67. user := &ExampleUser{
  68. ID: userID,
  69. Name: s.Name,
  70. password: s.Password,
  71. Group: s.group,
  72. }
  73. // генерируем токен авторизацции
  74. token, err := req.GenerateToken(
  75. json.Map{
  76. "id": userID,
  77. },
  78. 0,
  79. )
  80. if err != nil {
  81. return req.OutError(rest.ErrorMessage("TokenGenerateError", err.Error()))
  82. }
  83. files := make(map[string]rest.IReadCloserLen)
  84. // сохраняем пользлвателя в хранилище
  85. App.users.Store(userID, user)
  86. //fields, err := rest.Fields(user, files, req.RData().Slice("fields", nil)...)
  87. fields, fErr := req.Fields(user, files)
  88. if err != nil {
  89. return req.OutError(fErr)
  90. }
  91. // возвращаем успешный ответ
  92. return req.OutSuccess(
  93. json.Map{
  94. "user": fields,
  95. "token": token,
  96. },
  97. nil,
  98. )
  99. }
  100. // user info ////////////////////////////////////////////
  101. type ExampleRequestUserInfo struct {
  102. user *ExampleUser
  103. }
  104. func (s *ExampleRequestUserInfo) Validate(req rest.IRequestIn) rest.IRequestOut {
  105. if req.Auth() == nil {
  106. return req.OutError(rest.ErrorMessage("NotAuth", "Not authorized"))
  107. }
  108. auth := req.Auth()
  109. user, check := App.users.Load(auth.Int("id", 0))
  110. if !check {
  111. return req.OutError(rest.ErrorMessage("UserNotFound", "User not found"))
  112. }
  113. s.user = user.(*ExampleUser)
  114. return nil
  115. }
  116. func (s *ExampleRequestUserInfo) Execute(req rest.IRequestIn) rest.IRequestOut {
  117. files := make(map[string]rest.IReadCloserLen)
  118. log.Println(s.user.Group)
  119. fields := req.RData().Slice("fields", nil)
  120. rFields, err := rest.Fields(s.user, files, fields...)
  121. log.Println(err)
  122. if err != nil {
  123. return req.OutError(err)
  124. }
  125. return req.OutSuccess(rFields, files)
  126. }
  127. // set avatar
  128. type ExampleRequestSetAvatar struct {
  129. user *ExampleUser
  130. avatar io.Reader
  131. }
  132. func (s *ExampleRequestSetAvatar) Validate(req rest.IRequestIn) rest.IRequestOut {
  133. // проверяем авторизацию
  134. if req.Auth() == nil {
  135. return req.OutError(rest.ErrorMessage("NotAuth", "Not authorized"))
  136. }
  137. // проверяем файл аватара
  138. var check bool
  139. if s.avatar, check = req.RFile("avatar.jpg"); !check {
  140. return req.OutError(rest.ErrorMessage("FileNotFound", "avatar.jpg"))
  141. }
  142. // поиск юзера
  143. auth := req.Auth()
  144. user, check := App.users.Load(auth.Int("id", 0))
  145. if !check {
  146. //return rest.ResponseErrorMessage("UserNotFound", "User not found", 500)
  147. return req.OutError(rest.ErrorMessage("UserNotFound", "User not found"))
  148. }
  149. s.user = user.(*ExampleUser)
  150. return nil
  151. }
  152. func (s *ExampleRequestSetAvatar) Execute(req rest.IRequestIn) rest.IRequestOut {
  153. // сохраняем аватар
  154. f, _ := req.RFile("avatar.jpg")
  155. s.user.Avatar, _ = io.ReadAll(f)
  156. log.Println("U_Ava", s.user.Avatar)
  157. // возвращаем пустой ответ
  158. return req.OutSuccess(json.Map{}, nil)
  159. }