92 lines
2.1 KiB
Go
92 lines
2.1 KiB
Go
package main
|
|
|
|
import (
|
|
"context"
|
|
"embed"
|
|
"errors"
|
|
"log"
|
|
"os"
|
|
"os/signal"
|
|
"ristek-task-be/internal/config"
|
|
"ristek-task-be/internal/db/sqlc/repository"
|
|
"ristek-task-be/internal/jwt"
|
|
"ristek-task-be/internal/server"
|
|
"syscall"
|
|
|
|
"github.com/golang-migrate/migrate/v4"
|
|
_ "github.com/golang-migrate/migrate/v4/database/postgres"
|
|
"github.com/golang-migrate/migrate/v4/source/iofs"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
//go:embed internal/db/sqlc/migrations/*.sql
|
|
var migrationFiles embed.FS
|
|
|
|
// @title Ristek Task API
|
|
// @version 1.0
|
|
// @description REST API for Ristek Task Backend
|
|
// @securityDefinitions.apikey BearerAuth
|
|
// @in header
|
|
// @name Authorization
|
|
// @description Enter your bearer token in the format: Bearer {token}
|
|
|
|
// @host localhost:8080
|
|
// @BasePath /
|
|
func main() {
|
|
log.SetOutput(os.Stdout)
|
|
log.SetFlags(log.LstdFlags | log.Lshortfile)
|
|
|
|
conf, err := config.MustLoad()
|
|
if err != nil {
|
|
log.Fatalf("failed to load config: %s", err)
|
|
}
|
|
|
|
errChan := make(chan error, 1)
|
|
signalChan := make(chan os.Signal, 1)
|
|
|
|
signal.Notify(signalChan, os.Interrupt, syscall.SIGTERM)
|
|
|
|
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
|
|
defer cancel()
|
|
|
|
connect, err := pgxpool.New(ctx, conf.DatabaseURL())
|
|
if err != nil {
|
|
log.Fatalf("failed to connect to database: %s", err)
|
|
return
|
|
}
|
|
defer connect.Close()
|
|
repo := repository.New(connect)
|
|
|
|
d, err := iofs.New(migrationFiles, "internal/db/sqlc/migrations")
|
|
if err != nil {
|
|
log.Fatalf("failed to create migration source: %s", err)
|
|
return
|
|
}
|
|
m, err := migrate.NewWithSourceInstance("iofs", d, conf.DatabaseURL())
|
|
if err != nil {
|
|
log.Fatalf("failed to initialize migrations: %s", err)
|
|
return
|
|
}
|
|
err = m.Up()
|
|
if err != nil && !errors.Is(err, migrate.ErrNoChange) {
|
|
log.Fatal(err)
|
|
return
|
|
}
|
|
|
|
j := jwt.New("yomama")
|
|
go func() {
|
|
s := server.New(conf.Addr(), conf.Port(), repo, j)
|
|
err = s.Start()
|
|
errChan <- err
|
|
}()
|
|
|
|
log.Printf("Server is running on %s:%s", conf.Addr(), conf.Port())
|
|
|
|
select {
|
|
case err = <-errChan:
|
|
log.Fatalf("service error: %w", err)
|
|
case sig := <-signalChan:
|
|
log.Printf("Received signal %s, initiating graceful shutdown", sig)
|
|
}
|
|
}
|