service.go 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. // package service -- главный объект сервиса
  2. package service
  3. import (
  4. "context"
  5. "fmt"
  6. "log"
  7. "sync"
  8. "git.p78su.freemyip.com/svi/gostore/internal/serv_http"
  9. "git.p78su.freemyip.com/svi/gostore/internal/store"
  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. disk types.IStore
  19. ctxBg context.Context // Неотменяемый контекст
  20. ctx context.Context // Контекст приложения
  21. fnCancel func() // Функция отмены контекста
  22. wg *sync.WaitGroup // Ожидатель потоков сервиса
  23. }
  24. // NewService -- возвращает новый объект сервиса
  25. func NewService() (types.IService, error) {
  26. ctxBg := context.Background()
  27. ctx, fnCancel := context.WithCancel(ctxBg)
  28. sf := &Service{
  29. ctxBg: ctxBg,
  30. ctx: ctx,
  31. fnCancel: fnCancel,
  32. wg: &sync.WaitGroup{},
  33. }
  34. var err error
  35. sf.disk, err = store.NewStore(sf)
  36. if err != nil {
  37. return nil, fmt.Errorf("NewService(): in create IStoreDisk, err=\n\t%w", err)
  38. }
  39. sf.servHttp, err = serv_http.NewServHttp(sf)
  40. if err != nil {
  41. return nil, fmt.Errorf("NewService(): in create IServHttp, err=\n\t%w", err)
  42. }
  43. return sf, nil
  44. }
  45. // ServHttp -- возвращает HTTP-сервер
  46. func (sf *Service) ServHttp() types.IServHttp {
  47. return sf.servHttp
  48. }
  49. // Store -- возвращает хранилище
  50. func (sf *Service) Store() types.IStore {
  51. return sf.disk
  52. }
  53. // CancelApp -- отменяет контекст приложения
  54. func (sf *Service) CancelApp() {
  55. sf.fnCancel()
  56. }
  57. // Ctx -- возвращает контекст приложения
  58. func (sf *Service) Ctx() context.Context {
  59. return sf.ctx
  60. }
  61. // Wg -- возвращает ожидатель группы потоков
  62. func (sf *Service) Wg() *sync.WaitGroup {
  63. return sf.wg
  64. }
  65. // Run -- запускает сервис в работу
  66. func (sf *Service) Run() error {
  67. go func() {
  68. err := sf.servHttp.Run()
  69. if err != nil {
  70. log.Printf("Service.Run(): in run IServHttp, err=\n\t%v\n", err)
  71. }
  72. }()
  73. sf.wg.Wait()
  74. return nil
  75. }