doc.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. package rest
  2. import (
  3. "log"
  4. "sync"
  5. "sync/atomic"
  6. "time"
  7. )
  8. type ExampleGroup struct {
  9. *Fielder
  10. ID int64
  11. Name string
  12. }
  13. type ExampleUser struct {
  14. *Fielder
  15. ID int64
  16. Name string
  17. Token string
  18. Group *ExampleGroup
  19. }
  20. // ExapmleApp реализует интерфейс IApplication, который отдает серверу параметры подключения,
  21. // секретный ключ шифрования токена авторизации,
  22. // а так же обрабатывает поступающие запросы
  23. type ExampleApp struct {
  24. SAddr string
  25. SSecret []byte
  26. Users *sync.Map
  27. Groups *sync.Map
  28. IDCounter int64
  29. }
  30. func (s *ExampleApp) GenerateID() int64 {
  31. id := atomic.AddInt64(&s.IDCounter, 1)
  32. return id
  33. }
  34. func (s *ExampleApp) Addr() string {
  35. return s.SAddr
  36. }
  37. func (s *ExampleApp) Secret() []byte {
  38. return s.SSecret
  39. }
  40. func (s *ExampleApp) Executer(r *Request) (IExecuter, bool) {
  41. return nil, false
  42. }
  43. var ExampleEngine *ExampleApp
  44. // ExampleNew показывает пример создания и запуска сервера с RestAPI
  45. func ExampleNew() {
  46. // создаем новый сервер с использованием приложения ExampleApp
  47. ExampleEngine = &ExampleApp{
  48. SAddr: "localhost:8080",
  49. SSecret: []byte("top-secret"),
  50. Users: new(sync.Map),
  51. Groups: new(sync.Map),
  52. IDCounter: 1,
  53. }
  54. // Добавляем публичную группу
  55. groupID := ExampleEngine.GenerateID()
  56. ExampleEngine.Groups.Store(
  57. groupID,
  58. &ExampleGroup{
  59. ID: groupID,
  60. Name: "public",
  61. },
  62. )
  63. // создаем сервер
  64. restServ := New(ExampleEngine)
  65. // пробуем запустить его. Если через секунду запуск не удался, будет возвращена ошибка
  66. if err := restServ.Listen(time.Second); err != nil {
  67. // ошибка запуска
  68. log.Fatal(err)
  69. }
  70. }
  71. ////////////////////////////////////////////////////////////
  72. type ExampleRequestRegister struct {
  73. ID int64
  74. Name string `rest:"required"`
  75. RoleIDS []int64 `rest:"required"`
  76. GroupID int64 `rest:"required"`
  77. // Объект группы, который определяется в валидации.
  78. // В боевых условиях это поле должно быть приватное.
  79. Group *ExampleGroup
  80. }
  81. func (s *ExampleRequestRegister) Validate(req *Request) *Response {
  82. // пользователь не должен быть авторизован
  83. if req.auth != nil {
  84. return ResponseErrorMessage("AlreadyAuthorized", "User is already authorized", 500)
  85. }
  86. // проверяем имя
  87. //if s.Name = strings.TrimSpace()
  88. // вилидируем группу
  89. group, check := ExampleEngine.Groups.Load(s.GroupID)
  90. if !check {
  91. return ResponseErrorMessage("GroupNotFound", "Group is not found", 500)
  92. }
  93. // Устанавливаем группу для использования в методе выполняния,
  94. // чтобы не выбирать её снова
  95. s.Group = group.(*ExampleGroup)
  96. return nil
  97. }
  98. func (s *ExampleRequestRegister) Execute(req *Request) *Response {
  99. userID := ExampleEngine.GenerateID()
  100. user := &ExampleUser{
  101. ID: userID,
  102. Name: s.Name,
  103. Group: s.Group,
  104. }
  105. user.Fielder = NewFielder(user)
  106. ExampleEngine.Users.Store(userID, user)
  107. fields, err := user.Fielder.Fields(req.Data().Slice("fields", nil)...)
  108. if err != nil {
  109. return ResponseErrorMessage("FieldsError", err.Error(), 500)
  110. }
  111. return ResponseSuccess(fields, nil)
  112. }