Files
thamanyah/cms/main.go
T
FahdShalhoub acae765948
Build, Push and Deploy CMS / build-push-deploy (push) Successful in 1m53s
CHANGE: Switched The Interface From HTML to JSON API
2026-08-16 23:15:53 +03:00

124 lines
3.2 KiB
Go

package main
import (
"context"
"fmt"
"log"
"net/http"
"os"
"thamanyah/cms/v2/internal/handlers"
"thamanyah/cms/v2/internal/services"
"github.com/aws/aws-sdk-go-v2/config"
"github.com/aws/aws-sdk-go-v2/service/mediaconvert"
"github.com/aws/aws-sdk-go-v2/service/s3"
_ "github.com/lib/pq"
)
func main() {
if len(os.Args) > 1 && os.Args[1] == "migrate" {
runMigrate()
return
}
runServer()
}
func runMigrate() {
concreteDBClient := services.CreateConcreteDbClient(requireDBConnectionString())
defer concreteDBClient.CloseConnection()
concreteDBClient.Migrate()
log.Println("migrations applied successfully")
}
func runServer() {
awsConfig, err := config.LoadDefaultConfig(context.Background())
if err != nil {
panic(fmt.Errorf("failed To Load S3 Config: %s", err))
}
bucketName := os.Getenv("S3_BUCKET")
if bucketName == "" {
panic(fmt.Errorf("missing required env var: S3_BUCKET"))
}
mediaConvertRole := os.Getenv("MEDIACONVERT_ROLE_ARN")
if mediaConvertRole == "" {
panic(fmt.Errorf("missing required env var: MEDIACONVERT_ROLE_ARN"))
}
mediaConvertInputBucket := os.Getenv("MEDIACONVERT_INPUT_BUCKET")
if mediaConvertInputBucket == "" {
panic(fmt.Errorf("missing required env var: MEDIACONVERT_INPUT_BUCKET"))
}
mediaConvertOutputBucket := os.Getenv("MEDIACONVERT_OUTPUT_BUCKET")
if mediaConvertOutputBucket == "" {
panic(fmt.Errorf("missing required env var: MEDIACONVERT_OUTPUT_BUCKET"))
}
concreteS3Client := &services.S3Concrete{
S3Client: s3.NewFromConfig(awsConfig),
Bucket: bucketName,
}
concreteS3Client.AssertSuccessfulConnection(context.Background())
services.S3Client = concreteS3Client
services.MediaConvertClient = &services.MediaConvertConcrete{
MediaConvertClient: mediaconvert.NewFromConfig(awsConfig),
Role: mediaConvertRole,
InputBucket: mediaConvertInputBucket,
OutputBucket: mediaConvertOutputBucket,
}
concreteDBClient := services.CreateConcreteDbClient(requireDBConnectionString())
defer concreteDBClient.CloseConnection()
concreteDBClient.AssertSuccessfulConnection(context.Background())
services.DB = concreteDBClient
mux := http.NewServeMux()
mux.HandleFunc("GET /health", handlers.Health)
mux.HandleFunc("GET /api/categories", handlers.ListCategories)
mux.HandleFunc("POST /api/videos/presign", handlers.PresignVideoUpload)
mux.HandleFunc("POST /api/videos", handlers.CompleteVideoUpload)
addr := ":8081"
log.Printf("listening on %s", addr)
if err := http.ListenAndServe(addr, mux); err != nil {
log.Fatal(err)
}
}
func requireDBConnectionString() string {
dbHost := os.Getenv("DB_HOST")
if dbHost == "" {
panic(fmt.Errorf("missing required env var: DB_HOST"))
}
dbPort := os.Getenv("DB_PORT")
if dbPort == "" {
panic(fmt.Errorf("missing required env var: DB_PORT"))
}
dbUser := os.Getenv("DB_USER")
if dbUser == "" {
panic(fmt.Errorf("missing required env var: DB_USER"))
}
dbPassword := os.Getenv("DB_PASSWORD")
if dbPassword == "" {
panic(fmt.Errorf("missing required env var: DB_PASSWORD"))
}
dbName := os.Getenv("DB_NAME")
if dbName == "" {
panic(fmt.Errorf("missing required env var: DB_NAME"))
}
return fmt.Sprintf(
"host=%s port=%s user=%s password=%s dbname=%s sslmode=require",
dbHost, dbPort, dbUser, dbPassword, dbName,
)
}