Skip to content

Commit

Permalink
chore: update new docs
Browse files Browse the repository at this point in the history
  • Loading branch information
katallaxie committed Jul 16, 2024
1 parent f43cff5 commit e56bfd6
Show file tree
Hide file tree
Showing 8 changed files with 114 additions and 26 deletions.
11 changes: 10 additions & 1 deletion api/api.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,16 @@ openapi: 3.0.1
info:
title: Knox
version: 1.0.0
description:
description: |
This is the Knox API specification. Knox is a service that manages Terraform environments and snapshots.
There is an available Helm chart for Knox.
```shell
helm repo add typhoon https://zeiss.github.io/knox/helm/charts
helm repo update
helm search repo typhoon
```
servers:
- url: https://localhost:8080
Expand Down
6 changes: 3 additions & 3 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ go 1.22.5

require (
github.com/getkin/kin-openapi v0.126.0
github.com/go-playground/validator/v10 v10.22.0
github.com/gofiber/fiber/v2 v2.52.5
github.com/golang/mock v1.7.0-rc.1
github.com/golangci/golangci-lint v1.59.1
Expand All @@ -14,10 +15,10 @@ require (
github.com/oapi-codegen/runtime v1.1.1
github.com/spf13/cobra v1.8.1
github.com/spf13/pflag v1.0.5
github.com/zeiss/fiber-authz v1.0.31
github.com/zeiss/fiber-goth v1.2.8
github.com/zeiss/fiber-htmx v1.3.19
github.com/zeiss/gorm-seed v0.1.2
golang.org/x/crypto v0.24.0
golang.org/x/mod v0.19.0
gorm.io/datatypes v1.2.1
gorm.io/driver/postgres v1.5.9
Expand Down Expand Up @@ -84,7 +85,6 @@ require (
github.com/go-openapi/swag v0.23.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.22.0 // indirect
github.com/go-sql-driver/mysql v1.8.1 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
github.com/go-toolsmith/astcopy v1.1.0 // indirect
Expand Down Expand Up @@ -225,13 +225,13 @@ require (
github.com/yagipy/maintidx v1.0.0 // indirect
github.com/yeya24/promlinter v0.3.0 // indirect
github.com/ykadowak/zerologlint v0.1.5 // indirect
github.com/zeiss/fiber-authz v1.0.31 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
go-simpler.org/musttag v0.12.2 // indirect
go-simpler.org/sloglint v0.7.1 // indirect
go.uber.org/automaxprocs v1.5.3 // indirect
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
golang.org/x/crypto v0.24.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
golang.org/x/exp/typeparams v0.0.0-20240314144324-c7f7c6466f7f // indirect
golang.org/x/net v0.26.0 // indirect
Expand Down
7 changes: 7 additions & 0 deletions internal/adapters/database/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,13 @@ func (r *readTxImpl) ListProjects(ctx context.Context, slug string, results *tab
Find(&results.Rows).Error
}

// ListEnvironments ...
func (r *readTxImpl) ListEnvironments(ctx context.Context, teamId, projectId string, results *tables.Results[models.Environment]) error {
return r.conn.Scopes(tables.PaginatedResults(&results.Rows, results, r.conn)).
Where("project_id = (?)", r.conn.Model(&models.Project{}).Where("name = ?", projectId).Where("team_id = (?)", r.conn.Model(&adapters.GothTeam{}).Where("slug = ?", teamId).Select("id")).Select("id")).
Find(&results.Rows).Error
}

// AuthenticateClient ...
func (r *readTxImpl) AuthenticateClient(ctx context.Context, teamId, projectId, environmentId, username, password string) error {
environment := models.Environment{
Expand Down
47 changes: 27 additions & 20 deletions internal/adapters/handlers/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func (h *apiHandlers) GetHealth(ctx context.Context, request openapi.GetHealthRe
// Get system readiness
// (GET /_ready)
func (h *apiHandlers) GetReady(ctx context.Context, request openapi.GetReadyRequestObject) (openapi.GetReadyResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get a list of projects
Expand Down Expand Up @@ -68,25 +68,32 @@ func (h *apiHandlers) CreateProject(ctx context.Context, request openapi.CreateP
// Delete a project
// (DELETE /project/{id})
func (h *apiHandlers) DeleteProject(ctx context.Context, request openapi.DeleteProjectRequestObject) (openapi.DeleteProjectResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get a project
// (GET /project/{id})
func (h *apiHandlers) GetProject(ctx context.Context, request openapi.GetProjectRequestObject) (openapi.GetProjectResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Update a project
// (PUT /project/{id})
func (h *apiHandlers) UpdateProject(ctx context.Context, request openapi.UpdateProjectRequestObject) (openapi.UpdateProjectResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get a list of environments
// (GET /project/{projectId}/environment)
func (h *apiHandlers) GetEnvironments(ctx context.Context, request openapi.GetEnvironmentsRequestObject) (openapi.GetEnvironmentsResponseObject, error) {
return nil, nil
query := dto.FromGetEnvironmentsRequestObject(request)

results, err := h.environment.ListEnvironments(ctx, query)
if err != nil {
return nil, fiber.NewError(fiber.StatusInternalServerError, err.Error())
}

return dto.ToGetEnvironmentsResponseObject(results), nil
}

// Create a new environment
Expand All @@ -105,55 +112,55 @@ func (h *apiHandlers) CreateEnvironment(ctx context.Context, request openapi.Cre
// Delete an environment
// (DELETE /project/{projectId}/environment/{environmentId})
func (h *apiHandlers) DeleteEnvironment(ctx context.Context, request openapi.DeleteEnvironmentRequestObject) (openapi.DeleteEnvironmentResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get an environment
// (GET /project/{projectId}/environment/{environmentId})
func (h *apiHandlers) GetEnvironment(ctx context.Context, request openapi.GetEnvironmentRequestObject) (openapi.GetEnvironmentResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Update an environment
// (PUT /project/{projectId}/environment/{environmentId})
func (h *apiHandlers) UpdateEnvironment(ctx context.Context, request openapi.UpdateEnvironmentRequestObject) (openapi.UpdateEnvironmentResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get a list of snapshots
// (GET /snapshot)
func (h *apiHandlers) GetSnapshots(ctx context.Context, request openapi.GetSnapshotsRequestObject) (openapi.GetSnapshotsResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Delete a snapshot
// (DELETE /snapshot/{id})
func (h *apiHandlers) DeleteSnapshot(ctx context.Context, request openapi.DeleteSnapshotRequestObject) (openapi.DeleteSnapshotResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get a snapshot
// (GET /snapshot/{id})
func (h *apiHandlers) GetSnapshot(ctx context.Context, request openapi.GetSnapshotRequestObject) (openapi.GetSnapshotResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Update a snapshot
// (PUT /snapshot/{id})
func (h *apiHandlers) UpdateSnapshot(ctx context.Context, request openapi.UpdateSnapshotRequestObject) (openapi.UpdateSnapshotResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get a task
// (GET /task/{id})
func (h *apiHandlers) GetTask(ctx context.Context, request openapi.GetTaskRequestObject) (openapi.GetTaskResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get a list of teams
// (GET /team)
func (h *apiHandlers) GetTeams(ctx context.Context, request openapi.GetTeamsRequestObject) (openapi.GetTeamsResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Create a new team
Expand Down Expand Up @@ -198,37 +205,37 @@ func (h *apiHandlers) GetTeam(ctx context.Context, request openapi.GetTeamReques
// Update a team
// (PUT /team/{id})
func (h *apiHandlers) UpdateTeam(ctx context.Context, request openapi.UpdateTeamRequestObject) (openapi.UpdateTeamResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get a list of users
// (GET /user)
func (h *apiHandlers) GetUsers(ctx context.Context, request openapi.GetUsersRequestObject) (openapi.GetUsersResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Create a new user
// (POST /user)
func (h *apiHandlers) PostUser(ctx context.Context, request openapi.PostUserRequestObject) (openapi.PostUserResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Delete a user
// (DELETE /user/{id})
func (h *apiHandlers) DeleteUser(ctx context.Context, request openapi.DeleteUserRequestObject) (openapi.DeleteUserResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Get a user
// (GET /user/{id})
func (h *apiHandlers) GetUser(ctx context.Context, request openapi.GetUserRequestObject) (openapi.GetUserResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Update a user
// (PUT /user/{id})
func (h *apiHandlers) UpdateUser(ctx context.Context, request openapi.UpdateUserRequestObject) (openapi.UpdateUserResponseObject, error) {
return nil, nil
return nil, fiber.NewError(fiber.StatusNotImplemented, "not implemented")
}

// Create a new snapshot
Expand Down
35 changes: 35 additions & 0 deletions internal/controllers/environment.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import (

"github.com/go-playground/validator/v10"
"github.com/zeiss/fiber-goth/adapters"
"github.com/zeiss/fiber-htmx/components/tables"
seed "github.com/zeiss/gorm-seed"
"github.com/zeiss/knox/internal/models"
"github.com/zeiss/knox/internal/ports"
Expand All @@ -24,6 +25,14 @@ type CreateEnvironmentCommand struct {
Password string `json:"password" form:"password" validate:"required,min=1,max=255"`
}

// ListEnvironmentsQuery ...
type ListEnvironmentsQuery struct {
Team string `json:"team" form:"team" validate:"required"`
Project string `json:"project" form:"project" validate:"required"`
Limit int `json:"limit" form:"limit" validate:"omitempty,min=1,max=100"`
Offset int `json:"offset" form:"offset" validate:"omitempty,min=0"`
}

// EnvironmentControllerImpl ...
type EnvironmentControllerImpl struct {
store seed.Database[ports.ReadTx, ports.ReadWriteTx]
Expand All @@ -33,6 +42,8 @@ type EnvironmentControllerImpl struct {
type EnvironmentController interface {
// CreateEnvironment ...
CreateEnvironment(ctx context.Context, cmd CreateEnvironmentCommand) error
// ListEnvironments ...
ListEnvironments(ctx context.Context, query ListEnvironmentsQuery) (tables.Results[models.Environment], error)
}

// NewEnvironmentController ...
Expand Down Expand Up @@ -83,3 +94,27 @@ func (c *EnvironmentControllerImpl) CreateEnvironment(ctx context.Context, cmd C
return tx.CreateEnvironment(ctx, &environment)
})
}

// ListEnvironments ...
func (c *EnvironmentControllerImpl) ListEnvironments(ctx context.Context, query ListEnvironmentsQuery) (tables.Results[models.Environment], error) {
validate = validator.New()

results := tables.Results[models.Environment]{
Limit: query.Limit,
Offset: query.Offset,
}

err := validate.Struct(query)
if err != nil {
return results, err
}

err = c.store.ReadTx(ctx, func(ctx context.Context, tx ports.ReadTx) error {
return tx.ListEnvironments(ctx, query.Team, query.Project, &results)
})
if err != nil {
return results, err
}

return results, nil
}
2 changes: 0 additions & 2 deletions internal/models/environment.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package models

import (
"fmt"
"time"

"github.com/google/uuid"
Expand Down Expand Up @@ -52,6 +51,5 @@ func (e *Environment) ComparePassword(password string) error {

// BeforeCreate gorm hook
func (e *Environment) BeforeCreate(db *gorm.DB) (err error) {
fmt.Println("BeforeCreate")
return e.HashPassword()
}
2 changes: 2 additions & 0 deletions internal/ports/db.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,8 @@ type ReadTx interface {
ListProjects(context.Context, string, *tables.Results[models.Project]) error
// AuthenticateClient ...
AuthenticateClient(context.Context, string, string, string, string, string) error
// ListEnvironments ...
ListEnvironments(context.Context, string, string, *tables.Results[models.Environment]) error
}

// ReadWriteTx provides methods for transactional read and write operations.
Expand Down
30 changes: 30 additions & 0 deletions pkg/dto/environment.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
package dto

import (
"github.com/zeiss/fiber-htmx/components/tables"
"github.com/zeiss/knox/internal/controllers"
"github.com/zeiss/knox/internal/models"
openapi "github.com/zeiss/knox/pkg/apis"
"github.com/zeiss/knox/pkg/utils"
)
Expand All @@ -23,3 +25,31 @@ func ToCreateEnvironmentResponseObject() openapi.CreateEnvironment201JSONRespons

return res
}

// FromGetEnvironmentsRequestObject ...
func FromGetEnvironmentsRequestObject(req openapi.GetEnvironmentsRequestObject) controllers.ListEnvironmentsQuery {
return controllers.ListEnvironmentsQuery{
Limit: utils.PtrInt(req.Params.Limit),
Offset: utils.PtrInt(req.Params.Offset),
Team: req.TeamId,
Project: req.ProjectId,
}
}

// ToGetEnvironmentsResponseObject ...
func ToGetEnvironmentsResponseObject(results tables.Results[models.Environment]) openapi.GetEnvironments200JSONResponse {
res := openapi.GetEnvironments200JSONResponse{}

environments := make([]openapi.Environment, results.GetLen())

for i, environment := range results.GetRows() {
environments[i] = openapi.Environment{
Id: utils.StrPtr(environment.ID.String()),
Name: utils.StrPtr(environment.Name),
}
}

res.Environments = &environments

return res
}

0 comments on commit e56bfd6

Please sign in to comment.