Last active 1 day ago

gistfile1.txt Raw
1package main
2
3import (
4 "context"
5 "log"
6 "net/http"
7 "os/signal"
8 "syscall"
9 "time"
10
11 "vkfc1-new-go/internal/config"
12 httpapi "vkfc1-new-go/internal/http"
13 "vkfc1-new-go/internal/queue"
14 mysqlrepo "vkfc1-new-go/internal/repository/mysql"
15 "vkfc1-new-go/internal/service"
16 s3storage "vkfc1-new-go/internal/storage/s3"
17 "vkfc1-new-go/internal/vk"
18)
19
20func main() {
21 cfg, err := config.Load()
22 if err != nil {
23 log.Fatalf("config load error: %v", err)
24 }
25
26 ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
27 defer cancel()
28
29 db, err := mysqlrepo.New(ctx, cfg.MySQLDSN(), cfg.DB.PoolMax)
30 if err != nil {
31 log.Fatalf("db init error: %v", err)
32 }
33 defer db.Close()
34
35 vkClient := vk.New(cfg.VK)
36 s3Client, err := s3storage.New(cfg.S3)
37 if err != nil {
38 log.Fatalf("s3 init error: %v", err)
39 }
40
41 svc := service.New(cfg, db, vkClient, s3Client)
42 router := httpapi.NewRouter(cfg, svc)
43
44 worker := queue.NewWorker(db, svc)
45 worker.Start(ctx)
46
47 srv := &http.Server{
48 Addr: cfg.HTTPAddr(),
49 Handler: router,
50 ReadTimeout: 20 * time.Second,
51 WriteTimeout: 40 * time.Second,
52 IdleTimeout: 60 * time.Second,
53 }
54
55 go func() {
56 log.Printf("api listening on %s", cfg.HTTPAddr())
57 if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
58 log.Fatalf("http server error: %v", err)
59 }
60 }()
61
62 <-ctx.Done()
63 shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 10*time.Second)
64 defer shutdownCancel()
65 _ = srv.Shutdown(shutdownCtx)
66}
67