request.go 3.0 KB

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