request.go 2.8 KB

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