gistfile1.txt
· 1.5 KiB · Text
Raw
package main
import (
"context"
"log"
"net/http"
"os/signal"
"syscall"
"time"
"vkfc1-new-go/internal/config"
httpapi "vkfc1-new-go/internal/http"
"vkfc1-new-go/internal/queue"
mysqlrepo "vkfc1-new-go/internal/repository/mysql"
"vkfc1-new-go/internal/service"
s3storage "vkfc1-new-go/internal/storage/s3"
"vkfc1-new-go/internal/vk"
)
func main() {
cfg, err := config.Load()
if err != nil {
log.Fatalf("config load error: %v", err)
}
ctx, cancel := signal.NotifyContext(context.Background(), syscall.SIGINT, syscall.SIGTERM)
defer cancel()
db, err := mysqlrepo.New(ctx, cfg.MySQLDSN(), cfg.DB.PoolMax)
if err != nil {
log.Fatalf("db init error: %v", err)
}
defer db.Close()
vkClient := vk.New(cfg.VK)
s3Client, err := s3storage.New(cfg.S3)
if err != nil {
log.Fatalf("s3 init error: %v", err)
}
svc := service.New(cfg, db, vkClient, s3Client)
router := httpapi.NewRouter(cfg, svc)
worker := queue.NewWorker(db, svc)
worker.Start(ctx)
srv := &http.Server{
Addr: cfg.HTTPAddr(),
Handler: router,
ReadTimeout: 20 * time.Second,
WriteTimeout: 40 * time.Second,
IdleTimeout: 60 * time.Second,
}
go func() {
log.Printf("api listening on %s", cfg.HTTPAddr())
if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
log.Fatalf("http server error: %v", err)
}
}()
<-ctx.Done()
shutdownCtx, shutdownCancel := context.WithTimeout(context.Background(), 10*time.Second)
defer shutdownCancel()
_ = srv.Shutdown(shutdownCtx)
}
| 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 | } |
| 67 |