// package service -- главный объект сервиса package service import ( "context" "fmt" "log" "git.p78su.freemyip.com/svi/gostore/internal/serv_http" "git.p78su.freemyip.com/svi/gostore/internal/store_disk" "git.p78su.freemyip.com/svi/gostore/internal/store_mem" "git.p78su.freemyip.com/svi/gostore/internal/store_user" "git.p78su.freemyip.com/svi/gostore/pkg/types" ) // Service -- главный объект сервиса type Service struct { user types.IStoreUser servHttp types.IServHttp dbMem types.IStoreMem dbDisk types.IStoreDisk ctxBg context.Context // Неотменяемый контекст ctx context.Context // Контекст приложения fnCancel func() // Функция отмены контекста } // NewService -- возвращает новый объект сервиса func NewService() (types.IService, error) { user, err := store_user.NewStoreUser() if err != nil { return nil, fmt.Errorf("NewService(): in create IStoreUser, err=\n\t%w", err) } ctxBg := context.Background() ctx, fnCancel := context.WithCancel(ctxBg) sf := &Service{ user: user, ctxBg: ctxBg, ctx: ctx, fnCancel: fnCancel, } sf.dbMem, err = store_mem.NewStoreMem() if err != nil { return nil, fmt.Errorf("NewService(): in create IStoreMem, err=\n\t%w", err) } sf.dbDisk, err = store_disk.NewStoreDisk(sf) if err != nil { return nil, fmt.Errorf("NewService(): in create IStoreDisk, err=\n\t%w", err) } sf.servHttp, err = serv_http.NewServHttp(sf) if err != nil { return nil, fmt.Errorf("NewService(): in create IServHttp, err=\n\t%w", err) } return sf, nil } // User -- возвращает хпользователя для авторизации на сервере func (sf *Service) User() types.IStoreUser { return sf.user } // StoreDisk -- возвращает хранилище на диске func (sf *Service) StoreDisk() types.IStoreDisk { return sf.dbDisk } // StoreMem -- возвращает хранилище в памяти func (sf *Service) StoreMem() types.IStoreMem { return sf.dbMem } // CancelApp -- отменяет контекст приложения func (sf *Service) CancelApp() { sf.fnCancel() } // Ctx -- возвращает контекст приложения func (sf *Service) Ctx() context.Context { return sf.ctx } // Run -- запускает сервис в работу func (sf *Service) Run() error { go func() { err := sf.servHttp.Run() if err != nil { log.Printf("Service.Run(): in run IServHttp, err=\n\t%v\n", err) } }() <-sf.ctx.Done() return nil }