Last active 1 day ago

nikita revised this gist 1 day ago. Go to revision

1 file changed, 66 insertions

gistfile1.txt(file created)

@@ -0,0 +1,66 @@
1 + package main
2 +
3 + import (
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 +
20 + func 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 + }
Newer Older