service.go 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // package service -- главный объект сервиса
  2. package service
  3. import (
  4. "context"
  5. "fmt"
  6. "log"
  7. "git.p78su.freemyip.com/svi/gostore/internal/serv_http"
  8. "git.p78su.freemyip.com/svi/gostore/internal/store_disk"
  9. "git.p78su.freemyip.com/svi/gostore/internal/store_mem"
  10. "git.p78su.freemyip.com/svi/gostore/internal/store_user"
  11. "git.p78su.freemyip.com/svi/gostore/pkg/types"
  12. )
  13. // Service -- главный объект сервиса
  14. type Service struct {
  15. user types.IStoreUser
  16. servHttp types.IServHttp
  17. dbMem types.IStoreMem
  18. dbDisk types.IStoreDisk
  19. ctxBg context.Context // Неотменяемый контекст
  20. ctx context.Context // Контекст приложения
  21. fnCancel func() // Функция отмены контекста
  22. }
  23. // NewService -- возвращает новый объект сервиса
  24. func NewService() (types.IService, error) {
  25. user, err := store_user.NewStoreUser()
  26. if err != nil {
  27. return nil, fmt.Errorf("NewService(): in create IStoreUser, err=\n\t%w", err)
  28. }
  29. ctxBg := context.Background()
  30. ctx, fnCancel := context.WithCancel(ctxBg)
  31. sf := &Service{
  32. user: user,
  33. ctxBg: ctxBg,
  34. ctx: ctx,
  35. fnCancel: fnCancel,
  36. }
  37. sf.dbMem, err = store_mem.NewStoreMem()
  38. if err != nil {
  39. return nil, fmt.Errorf("NewService(): in create IStoreMem, err=\n\t%w", err)
  40. }
  41. sf.dbDisk, err = store_disk.NewStoreDisk(sf)
  42. if err != nil {
  43. return nil, fmt.Errorf("NewService(): in create IStoreDisk, err=\n\t%w", err)
  44. }
  45. sf.servHttp, err = serv_http.NewServHttp(sf)
  46. if err != nil {
  47. return nil, fmt.Errorf("NewService(): in create IServHttp, err=\n\t%w", err)
  48. }
  49. return sf, nil
  50. }
  51. // User -- возвращает хпользователя для авторизации на сервере
  52. func (sf *Service) User() types.IStoreUser {
  53. return sf.user
  54. }
  55. // StoreDisk -- возвращает хранилище на диске
  56. func (sf *Service) StoreDisk() types.IStoreDisk {
  57. return sf.dbDisk
  58. }
  59. // StoreMem -- возвращает хранилище в памяти
  60. func (sf *Service) StoreMem() types.IStoreMem {
  61. return sf.dbMem
  62. }
  63. // CancelApp -- отменяет контекст приложения
  64. func (sf *Service) CancelApp() {
  65. sf.fnCancel()
  66. }
  67. // Ctx -- возвращает контекст приложения
  68. func (sf *Service) Ctx() context.Context {
  69. return sf.ctx
  70. }
  71. // Run -- запускает сервис в работу
  72. func (sf *Service) Run() error {
  73. go func() {
  74. err := sf.servHttp.Run()
  75. if err != nil {
  76. log.Printf("Service.Run(): in run IServHttp, err=\n\t%v\n", err)
  77. }
  78. }()
  79. <-sf.ctx.Done()
  80. return nil
  81. }