request.go 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. package rest_http
  2. import (
  3. "io"
  4. "net/http"
  5. "git.ali33.ru/fcg-xvii/go-tools/json"
  6. "git.ali33.ru/fcg-xvii/rest"
  7. )
  8. // Request реализует объект запроса
  9. type Request struct {
  10. *http.Request
  11. core any
  12. auth json.Map
  13. data json.Map
  14. files map[string]io.ReadCloser
  15. tokenGenerator func(json.Map, int64) (string, error)
  16. }
  17. func (s *Request) Root() any {
  18. return s.Request
  19. }
  20. func (s *Request) Core() any {
  21. return s.core
  22. }
  23. // GenerateToken создает новый токен авторизации. expire - timestamp даты, после которой токен не будет действителен (если указан 0 - токен бессрочный)
  24. func (s *Request) GenerateToken(data json.Map, expire int64) (string, error) {
  25. return s.tokenGenerator(data, expire)
  26. }
  27. // Возвращает путь (краткий url) запроса
  28. func (s *Request) Command() string {
  29. return s.URL.Path
  30. }
  31. // Data возвращает словерь json запроса
  32. func (s *Request) Data() json.Map {
  33. return s.data
  34. }
  35. // FileKeys возвращает все имена файлы, которые доступны в запросе
  36. func (s *Request) FileKeys() []string {
  37. res := make([]string, 0, len(s.files))
  38. for k := range s.files {
  39. res = append(res, k)
  40. }
  41. return res
  42. }
  43. // File возвращает файл, принятый в запросе multipart/form-data, если он существует
  44. func (s *Request) File(name string) (io.Reader, bool) {
  45. r, check := s.files[name]
  46. return r, check
  47. }
  48. // Auth возвращает словарь с данными об авторизации (при условии, что в заголовке Bearer указан токен и его удалось успешно расшифровать и распарсить)
  49. func (s *Request) Auth() json.Map {
  50. return s.auth
  51. }
  52. // IsAuth указывает, есть ли словарь авторизации или нет
  53. func (s *Request) IsAuth() bool {
  54. return s.auth != nil
  55. }
  56. // IsJSON возарвщвет true, если в заголовке ContentType application/json
  57. func (s *Request) IsJSON() bool {
  58. return s.Header.Get("Content-Type") == "application/json"
  59. }
  60. // // IsForm возарвщвет true, если в заголовке ContentType multipart/form-data
  61. func (s *Request) IsForm() bool {
  62. return s.Header.Get("Content-Type") == "application/x-www-form-urlencoded"
  63. }
  64. // Close закрывает все открытые ресурсы запоса (файлы)
  65. func (s *Request) Close() {
  66. for _, file := range s.files {
  67. file.Close()
  68. }
  69. }
  70. func (s *Request) ResponseSuccess(data json.Map, files map[string]io.ReadCloser) rest.IResponse {
  71. return ResponseSuccess(data, files)
  72. }
  73. func (s *Request) ResponseError(code int, err rest.IErrorArgs) rest.IResponse {
  74. return ResponseError(code, err)
  75. }