Add applications

This commit is contained in:
2022-02-16 15:30:38 +01:00
parent 205adeb118
commit f35f277b16
10 changed files with 248 additions and 21 deletions

View File

@@ -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)
}
}