157 lines
3.7 KiB
Go
157 lines
3.7 KiB
Go
package settings
|
|
|
|
import (
|
|
"fmt"
|
|
"gitlab.com/texm/shokku/internal/env"
|
|
"gitlab.com/texm/shokku/internal/models"
|
|
"gitlab.com/texm/shokku/internal/server/dto"
|
|
"net/http"
|
|
|
|
"github.com/labstack/echo/v4"
|
|
)
|
|
|
|
func GetVersions(e *env.Env, c echo.Context) error {
|
|
dokkuVersion, err := e.Dokku.GetDokkuVersion()
|
|
if err != nil {
|
|
return fmt.Errorf("getting dokku version: %w", err)
|
|
}
|
|
return c.JSON(http.StatusOK, &dto.GetVersionsResponse{
|
|
Dokku: dokkuVersion,
|
|
Shokku: e.Version,
|
|
})
|
|
}
|
|
|
|
func GetUsers(e *env.Env, c echo.Context) error {
|
|
var dbUsers []models.User
|
|
res := e.DB.Model(models.User{}).Preload("SSHKeys").Find(&dbUsers)
|
|
if res.Error != nil {
|
|
return fmt.Errorf("querying db users: %w", res.Error)
|
|
}
|
|
|
|
users := make([]dto.User, len(dbUsers))
|
|
for i, dbUser := range dbUsers {
|
|
keys := make([]string, len(dbUser.SSHKeys))
|
|
for j, key := range dbUser.SSHKeys {
|
|
keys[j] = key.Key
|
|
}
|
|
users[i] = dto.User{
|
|
Name: dbUser.Name,
|
|
Source: dbUser.Source,
|
|
SSHKeys: keys,
|
|
}
|
|
}
|
|
|
|
return c.JSON(http.StatusOK, dto.GetUsersResponse{
|
|
Users: users,
|
|
})
|
|
}
|
|
|
|
func GetSSHKeys(e *env.Env, c echo.Context) error {
|
|
keys, err := e.Dokku.ListSSHKeys()
|
|
if err != nil {
|
|
return fmt.Errorf("listing ssh keys: %w", err)
|
|
}
|
|
return c.JSON(http.StatusOK, &dto.GetSSHKeysResponse{
|
|
Keys: keys,
|
|
})
|
|
}
|
|
|
|
func GetGlobalDomains(e *env.Env, c echo.Context) error {
|
|
report, err := e.Dokku.GetGlobalDomainsReport()
|
|
if err != nil {
|
|
return fmt.Errorf("getting global domains report: %w", err)
|
|
}
|
|
|
|
if len(report.Domains) == 0 {
|
|
report.Domains = make([]string, 0)
|
|
}
|
|
|
|
return c.JSON(http.StatusOK, &dto.GetGlobalDomainsResponse{
|
|
Domains: report.Domains,
|
|
Enabled: report.Enabled,
|
|
})
|
|
}
|
|
|
|
func AddGlobalDomain(e *env.Env, c echo.Context) error {
|
|
var req dto.AlterGlobalDomainRequest
|
|
if err := dto.BindRequest(c, &req); err != nil {
|
|
return err.ToHTTP()
|
|
}
|
|
|
|
// TODO: domain verification etc
|
|
if err := e.Dokku.AddGlobalDomain(req.Domain); err != nil {
|
|
return fmt.Errorf("adding global domain: %w", err)
|
|
}
|
|
|
|
return c.NoContent(http.StatusOK)
|
|
}
|
|
|
|
func RemoveGlobalDomain(e *env.Env, c echo.Context) error {
|
|
var req dto.DeleteGlobalDomainRequest
|
|
if err := dto.BindRequest(c, &req); err != nil {
|
|
return err.ToHTTP()
|
|
}
|
|
|
|
// TODO: domain verification etc
|
|
if err := e.Dokku.RemoveGlobalDomain(req.Domain); err != nil {
|
|
return fmt.Errorf("removing global domain: %w", err)
|
|
}
|
|
|
|
return c.NoContent(http.StatusOK)
|
|
}
|
|
|
|
func SetEventLoggingEnabled(e *env.Env, c echo.Context) error {
|
|
var req dto.SetEventLoggingEnabledRequest
|
|
if err := dto.BindRequest(c, &req); err != nil {
|
|
return err.ToHTTP()
|
|
}
|
|
|
|
if err := e.Dokku.SetEventLoggingEnabled(req.Enabled); err != nil {
|
|
return fmt.Errorf("setting event logging: %w", err)
|
|
}
|
|
|
|
return c.NoContent(http.StatusOK)
|
|
}
|
|
|
|
func GetEventLogsList(e *env.Env, c echo.Context) error {
|
|
events, err := e.Dokku.ListLoggedEvents()
|
|
if err != nil {
|
|
return fmt.Errorf("removing global domain: %w", err)
|
|
}
|
|
|
|
return c.JSON(http.StatusOK, dto.GetEventLogsListResponse{
|
|
Events: events,
|
|
})
|
|
}
|
|
|
|
func GetEventLogs(e *env.Env, c echo.Context) error {
|
|
logs, err := e.Dokku.GetEventLogs()
|
|
if err != nil {
|
|
return fmt.Errorf("getting event logs: %w", err)
|
|
}
|
|
|
|
return c.JSON(http.StatusOK, dto.GetEventLogsResponse{
|
|
Logs: logs,
|
|
})
|
|
}
|
|
|
|
func ListPlugins(e *env.Env, c echo.Context) error {
|
|
plugins, err := e.Dokku.ListPlugins()
|
|
if err != nil {
|
|
return fmt.Errorf("listing plugins: %w", err)
|
|
}
|
|
info := make([]dto.PluginInfo, len(plugins))
|
|
for i := 0; i < len(plugins); i++ {
|
|
p := plugins[i]
|
|
info[i] = dto.PluginInfo{
|
|
Name: p.Name,
|
|
Version: p.Version,
|
|
Enabled: p.Enabled,
|
|
Description: p.Description,
|
|
}
|
|
}
|
|
return c.JSON(http.StatusOK, &dto.ListPluginsResponse{
|
|
Plugins: info,
|
|
})
|
|
}
|