123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178 |
- package example_test
- import (
- "bytes"
- "fmt"
- "io"
- "log"
- "strings"
- "git.ali33.ru/fcg-xvii/go-tools/json"
- "git.ali33.ru/fcg-xvii/rest"
- )
- type ExampleUser struct {
- ID int64 `rest:"default"`
- Name string `rest:"default"`
- password string
- Group *ExampleGroup
- Avatar []byte `rest:"ignore"`
- }
- func (s *ExampleUser) RestFields(result json.Map, files map[string]io.ReadCloser, names rest.FieldList) {
- if _, check := names.Field("avatar"); check {
- if len(s.Avatar) == 0 {
- result["avatar"] = nil
- } else {
- fName := fmt.Sprintf("user%v.avatar.jpg", s.ID)
- result["avatar"] = fName
- log.Println("--------------------------->", s.Avatar)
- files[fName] = io.NopCloser(bytes.NewReader(s.Avatar))
- }
- }
- }
- // Register ////////////////////////////////////////////
- type ExampleRequestRegister struct {
- ID int64
- Name string `rest:"required"`
- Password string `rest:"required"`
- GroupID int64 `rest:"required"`
- // Объект группы, который определяется в валидации.
- // В боевых условиях это поле должно быть приватное.
- group *ExampleGroup
- }
- func (s *ExampleRequestRegister) Validate(req rest.IRequestIn) rest.IRequestOut {
- // пользователь не должен быть авторизован
- if req.Auth() != nil {
- return req.OutError(rest.ErrorMessage("AlreadyAuthorized", "User is already authorized"))
- }
- // проверяем имя
- if s.Name = strings.TrimSpace(s.Name); len(s.Name) == 0 {
- return req.OutError(rest.ErrorFiled("name", "expected not empty string"))
- }
- // проверяем пароль
- if len(s.Password) < 3 {
- return req.OutError(rest.ErrorFiled("password", "expected minimum 3 symbols"))
- }
- // вилидируем группу
- group, check := App.groups.Load(s.GroupID)
- if !check {
- return req.OutError(rest.ErrorMessage("GroupNotFound", "Group is not found"))
- }
- // Устанавливаем группу для использования в методе выполняния,
- // чтобы не выбирать её снова
- s.group = group.(*ExampleGroup)
- return nil
- }
- func (s *ExampleRequestRegister) Execute(req rest.IRequestIn) rest.IRequestOut {
- return req.OutError(rest.ErrorMessage("!!!", "..."))
- // создаем нового юзера
- userID := App.GenerateID()
- user := &ExampleUser{
- ID: userID,
- Name: s.Name,
- password: s.Password,
- Group: s.group,
- }
- // генерируем токен авторизацции
- token, err := req.GenerateToken(
- json.Map{
- "id": userID,
- },
- 0,
- )
- if err != nil {
- return req.OutError(rest.ErrorMessage("TokenGenerateError", err.Error()))
- }
- files := make(map[string]rest.IReadCloserLen)
- // сохраняем пользлвателя в хранилище
- App.users.Store(userID, user)
- //fields, err := rest.Fields(user, files, req.RData().Slice("fields", nil)...)
- fields, fErr := req.Fields(user, files)
- if err != nil {
- return req.OutError(fErr)
- }
- // возвращаем успешный ответ
- return req.OutSuccess(
- json.Map{
- "user": fields,
- "token": token,
- },
- nil,
- )
- }
- // user info ////////////////////////////////////////////
- type ExampleRequestUserInfo struct {
- user *ExampleUser
- }
- func (s *ExampleRequestUserInfo) Validate(req rest.IRequestIn) rest.IRequestOut {
- if req.Auth() == nil {
- return req.OutError(rest.ErrorMessage("NotAuth", "Not authorized"))
- }
- auth := req.Auth()
- user, check := App.users.Load(auth.Int("id", 0))
- if !check {
- return req.OutError(rest.ErrorMessage("UserNotFound", "User not found"))
- }
- s.user = user.(*ExampleUser)
- return nil
- }
- func (s *ExampleRequestUserInfo) Execute(req rest.IRequestIn) rest.IRequestOut {
- files := make(map[string]rest.IReadCloserLen)
- log.Println(s.user.Group)
- fields := req.RData().Slice("fields", nil)
- rFields, err := rest.Fields(s.user, files, fields...)
- log.Println(err)
- if err != nil {
- return req.OutError(err)
- }
- return req.OutSuccess(rFields, files)
- }
- // set avatar
- type ExampleRequestSetAvatar struct {
- user *ExampleUser
- avatar io.Reader
- }
- func (s *ExampleRequestSetAvatar) Validate(req rest.IRequestIn) rest.IRequestOut {
- // проверяем авторизацию
- if req.Auth() == nil {
- return req.OutError(rest.ErrorMessage("NotAuth", "Not authorized"))
- }
- // проверяем файл аватара
- var check bool
- if s.avatar, check = req.RFile("avatar.jpg"); !check {
- return req.OutError(rest.ErrorMessage("FileNotFound", "avatar.jpg"))
- }
- // поиск юзера
- auth := req.Auth()
- user, check := App.users.Load(auth.Int("id", 0))
- if !check {
- //return rest.ResponseErrorMessage("UserNotFound", "User not found", 500)
- return req.OutError(rest.ErrorMessage("UserNotFound", "User not found"))
- }
- s.user = user.(*ExampleUser)
- return nil
- }
- func (s *ExampleRequestSetAvatar) Execute(req rest.IRequestIn) rest.IRequestOut {
- // сохраняем аватар
- f, _ := req.RFile("avatar.jpg")
- s.user.Avatar, _ = io.ReadAll(f)
- log.Println("U_Ava", s.user.Avatar)
- // возвращаем пустой ответ
- return req.OutSuccess(json.Map{}, nil)
- }
|