Add applications
This commit is contained in:
@@ -12,7 +12,7 @@ import (
|
||||
"github.com/gin-gonic/gin"
|
||||
"github.com/go-co-op/gocron"
|
||||
"github.com/google/uuid"
|
||||
"github.com/jackc/pgx/v4/pgxpool"
|
||||
"github.com/jackc/pgx/v4"
|
||||
"github.com/prometheus/client_golang/prometheus/promhttp"
|
||||
"go.uber.org/zap"
|
||||
"go.uber.org/zap/zapcore"
|
||||
@@ -20,6 +20,7 @@ import (
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"serverctl/pkg/application/applications"
|
||||
"serverctl/pkg/application/projects"
|
||||
"serverctl/pkg/application/users"
|
||||
"serverctl/pkg/db"
|
||||
@@ -85,7 +86,7 @@ func BasicAuthMiddleware(l *zap.Logger, us *users.Service) gin.HandlerFunc {
|
||||
c.Next()
|
||||
}
|
||||
}
|
||||
func setupApi(l *zap.Logger, cc *cache.MetricCache, us *users.Service, ps *projects.Service) {
|
||||
func setupApi(l *zap.Logger, cc *cache.MetricCache, us *users.Service, ps *projects.Service, as *applications.Service) {
|
||||
l.Info("Setting up serverctl setupApi (using gin)")
|
||||
|
||||
r := gin.Default()
|
||||
@@ -180,6 +181,28 @@ func setupApi(l *zap.Logger, cc *cache.MetricCache, us *users.Service, ps *proje
|
||||
c.JSON(http.StatusOK, getProject)
|
||||
})
|
||||
|
||||
applications := r.Group("/applications", BasicAuthMiddleware(l, us))
|
||||
applications.POST("/", func(c *gin.Context) {
|
||||
type CreateApplicationRequest struct {
|
||||
ProjectId int `json:"projectId" binding:"required"`
|
||||
Name string `json:"name" binding:"required"`
|
||||
}
|
||||
|
||||
var createApplicationRequest CreateApplicationRequest
|
||||
if err := c.BindJSON(&createApplicationRequest); err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
userId, _ := c.Get("userId")
|
||||
applicationId, err := as.CreateApplication(c.Request.Context(), createApplicationRequest.Name, userId.(int), createApplicationRequest.ProjectId)
|
||||
if err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"message": "you have provided invalid input"})
|
||||
return
|
||||
}
|
||||
|
||||
c.JSON(http.StatusCreated, gin.H{"message": "application has been created", "applicationId": applicationId})
|
||||
})
|
||||
|
||||
containers := r.Group("/containers", BasicAuthMiddleware(l, us))
|
||||
containers.GET("/", func(c *gin.Context) {
|
||||
type container struct {
|
||||
@@ -274,10 +297,12 @@ func main() {
|
||||
usersService := users.NewService(logger, usersRepository, cacheM)
|
||||
projectsRepository := postgres.NewProjectsRepository(database)
|
||||
projectsService := projects.NewService(logger, projectsRepository, cacheM)
|
||||
applicationsRepository := postgres.NewApplicationRepository(logger, database)
|
||||
applicationsService := applications.NewService(logger, applicationsRepository)
|
||||
|
||||
setupProfiler()
|
||||
addSeedData(database, usersRepository, projectsRepository)
|
||||
setupApi(logger, cacheM, usersService, projectsService)
|
||||
addSeedData(database, usersRepository, projectsRepository, logger)
|
||||
setupApi(logger, cacheM, usersService, projectsService, applicationsService)
|
||||
}
|
||||
|
||||
func setupProfiler() {
|
||||
@@ -286,7 +311,7 @@ func setupProfiler() {
|
||||
}()
|
||||
}
|
||||
|
||||
func addSeedData(database *db.Client, ur users.Repository, pr projects.Repository) {
|
||||
func addSeedData(database *db.Client, ur users.Repository, pr projects.Repository, logger *zap.Logger) {
|
||||
conn := database.GetConn(context.Background())
|
||||
defer conn.Release()
|
||||
|
||||
@@ -297,35 +322,42 @@ func addSeedData(database *db.Client, ur users.Repository, pr projects.Repositor
|
||||
}
|
||||
|
||||
if numRows == 0 {
|
||||
addTestData(conn, ur, pr)
|
||||
addTestData(database, ur, pr, logger)
|
||||
}
|
||||
}
|
||||
|
||||
func addTestData(conn *pgxpool.Conn, ur users.Repository, pr projects.Repository) {
|
||||
func addTestData(database *db.Client, ur users.Repository, pr projects.Repository, logger *zap.Logger) {
|
||||
ctx := context.Background()
|
||||
for jobs := 0; jobs < 100; jobs++ {
|
||||
go func() {
|
||||
for i := 0; i < 1_000; i++ {
|
||||
|
||||
for jobs := 0; jobs < 10; jobs++ {
|
||||
go func(batchNr int) {
|
||||
conn := database.GetConn(ctx)
|
||||
defer conn.Release()
|
||||
batch := &pgx.Batch{}
|
||||
numInserts := 5_000
|
||||
for i := 0; i < numInserts; i++ {
|
||||
var (
|
||||
user *users.CreateUser
|
||||
err error
|
||||
userId int
|
||||
user *users.CreateUser
|
||||
err error
|
||||
)
|
||||
|
||||
user, err = users.NewCreateUser(fmt.Sprintf("%s@test.com", uuid.New().String()), "password", users.NewPlainTextPasswordHasher())
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
userId, err = ur.Create(ctx, user)
|
||||
batch.Queue("INSERT INTO sctl_user(email, password_hash) values ($1, $2)", user.Email, user.PasswordHash)
|
||||
}
|
||||
res := conn.SendBatch(ctx, batch)
|
||||
for i := 0; i < numInserts; i++ {
|
||||
_, err := res.Exec()
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
||||
_, err = pr.Create(ctx, projects.NewCreateProject(uuid.New().String()[:20], userId))
|
||||
if err != nil {
|
||||
panic(err)
|
||||
return
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
logger.Debug("sent batch",
|
||||
zap.Int("batchId", batchNr))
|
||||
}(jobs)
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user