chore: initial project scaffold with admin web, backend, desktop client, and deployment setup
Add monorepo structure for NexaVPN WireGuard control plane including: - .gitignore for node_modules, build artifacts, and environment files - README with project overview, monorepo layout, and quick start guide - Admin web UI with React, Vite, TypeScript, and nginx reverse proxy - API client with type definitions for users, devices, policies, gateways, and audit logs - Admin pages for dashboard, users, devices, policies, g
This commit is contained in:
62
backend/internal/app/app.go
Normal file
62
backend/internal/app/app.go
Normal file
@@ -0,0 +1,62 @@
|
||||
package app
|
||||
|
||||
import (
|
||||
"context"
|
||||
"net/http"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
|
||||
"github.com/nexavpn/nexavpn/backend/internal/audit"
|
||||
"github.com/nexavpn/nexavpn/backend/internal/auth"
|
||||
"github.com/nexavpn/nexavpn/backend/internal/config"
|
||||
"github.com/nexavpn/nexavpn/backend/internal/db"
|
||||
"github.com/nexavpn/nexavpn/backend/internal/device"
|
||||
"github.com/nexavpn/nexavpn/backend/internal/gateway"
|
||||
"github.com/nexavpn/nexavpn/backend/internal/httpserver"
|
||||
"github.com/nexavpn/nexavpn/backend/internal/ipam"
|
||||
"github.com/nexavpn/nexavpn/backend/internal/policy"
|
||||
"github.com/nexavpn/nexavpn/backend/internal/user"
|
||||
)
|
||||
|
||||
type App struct {
|
||||
DB *pgxpool.Pool
|
||||
Router http.Handler
|
||||
}
|
||||
|
||||
func New(cfg config.Config) (*App, error) {
|
||||
ctx := context.Background()
|
||||
|
||||
pool, err := db.Connect(ctx, cfg.DatabaseURL)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
authRepo := auth.NewPGRepository(pool)
|
||||
authService := auth.NewService(authRepo, cfg.JWTSecret, cfg.JWTIssuer, cfg.AccessTokenTTL, cfg.RefreshTokenTTL)
|
||||
|
||||
userService := user.NewService(user.NewPGRepository(pool))
|
||||
policyService := policy.NewService(policy.NewPGRepository(pool))
|
||||
gatewayService := gateway.NewService(gateway.NewPGRepository(pool))
|
||||
deviceService := device.NewService(device.NewPGRepository(pool), policyService, gatewayService, ipam.NewService())
|
||||
auditService := audit.NewService(audit.NewPGRepository(pool))
|
||||
|
||||
router := httpserver.NewRouter(cfg.JWTSecret, httpserver.Handlers{
|
||||
Auth: auth.NewHandler(authService, auditService),
|
||||
User: user.NewHandler(userService, auditService),
|
||||
Device: device.NewHandler(deviceService, auditService),
|
||||
Policy: policy.NewHandler(policyService, auditService),
|
||||
Gateway: gateway.NewHandler(gatewayService),
|
||||
Audit: audit.NewHandler(auditService),
|
||||
})
|
||||
|
||||
return &App{
|
||||
DB: pool,
|
||||
Router: router,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (a *App) Close() {
|
||||
if a.DB != nil {
|
||||
a.DB.Close()
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user