Compare commits
15 Commits
feature/ad
...
v0.10.3
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1683d5c2f1 | ||
|
|
87d4af0bec | ||
|
|
35449a090d | ||
|
|
5324a41e05 | ||
|
|
ac61ba5223 | ||
|
|
56c51e5d02 | ||
|
|
1c57da9aba | ||
|
|
b2d88f1aa3 | ||
|
|
45d9681203 | ||
|
|
e259f2235a | ||
|
|
e575f641c5 | ||
|
|
bb75a8c325 | ||
|
|
99b1a2d1e9 | ||
|
|
a34b08072e | ||
|
|
8057420f09 |
@@ -8,13 +8,13 @@ env:
|
||||
GO_VERSION: "1.21"
|
||||
BINARY_NAME: "acc-server-manager"
|
||||
MIGRATE_BINARY: "acc-server-migration"
|
||||
API_BINARY: "api"
|
||||
DEPLOY_PATH: 'C:\acc-server-manager'
|
||||
SERVICE_NAME: "ACC Server Manager"
|
||||
HEALTH_URL: "http://localhost:4000/v1/system/health"
|
||||
|
||||
jobs:
|
||||
build:
|
||||
runs-on: windows-latest
|
||||
runs-on: windows
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v3
|
||||
@@ -27,35 +27,17 @@ jobs:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
|
||||
- name: Run tests
|
||||
env:
|
||||
CGO_ENABLED: 1
|
||||
run: go test -v ./...
|
||||
|
||||
- name: Build binaries
|
||||
env:
|
||||
CGO_ENABLED: 1
|
||||
run: |
|
||||
mkdir -p build
|
||||
go build -v -o ./build/${{ env.BINARY_NAME }}.exe ./cmd/server
|
||||
go build -v -o ./build/${{ env.MIGRATE_BINARY }}.exe ./cmd/migration
|
||||
go build -v -o ./build/${{ env.API_BINARY }}.exe ./cmd/api
|
||||
|
||||
- name: Create release
|
||||
id: create_release
|
||||
uses: actions/create-release@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
tag_name: ${{ github.ref }}
|
||||
release_name: Release ${{ github.ref }}
|
||||
draft: false
|
||||
prerelease: false
|
||||
|
||||
- name: Upload release assets
|
||||
uses: actions/upload-release-asset@v1
|
||||
env:
|
||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
with:
|
||||
upload_url: ${{ steps.create_release.outputs.upload_url }}
|
||||
asset_path: ./build/
|
||||
asset_name: acc-server-manager-${{ github.ref_name }}.zip
|
||||
asset_content_type: application/zip
|
||||
go build -v -o ./build/${{ env.MIGRATE_BINARY }}.exe ./cmd/migrate
|
||||
go build -v -o ./build/${{ env.BINARY_NAME }}.exe ./cmd/api
|
||||
|
||||
- name: Upload build artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
@@ -66,7 +48,7 @@ jobs:
|
||||
|
||||
deploy:
|
||||
needs: build
|
||||
runs-on: windows-latest
|
||||
runs-on: windows
|
||||
environment: production
|
||||
steps:
|
||||
- name: Download build artifacts
|
||||
@@ -113,7 +95,8 @@ jobs:
|
||||
# Run database migrations
|
||||
Write-Host "Running database migrations..."
|
||||
try {
|
||||
& "${{ env.DEPLOY_PATH }}\${{ env.MIGRATE_BINARY }}.exe"
|
||||
& cd "${{ env.DEPLOY_PATH }}"
|
||||
& ".\${{ env.MIGRATE_BINARY }}.exe"
|
||||
} catch {
|
||||
Write-Warning "Migration failed: $_"
|
||||
throw "Migration failed"
|
||||
@@ -153,7 +136,7 @@ jobs:
|
||||
|
||||
while ($attempt -le $maxAttempts -and -not $success) {
|
||||
try {
|
||||
$response = Invoke-WebRequest -Uri "http://localhost:8080/health" -TimeoutSec 5
|
||||
$response = Invoke-WebRequest -Uri "${{ env.HEALTH_URL }}" -TimeoutSec 5
|
||||
if ($response.StatusCode -eq 200) {
|
||||
Write-Host "Health check passed!"
|
||||
$success = $true
|
||||
@@ -168,31 +151,3 @@ jobs:
|
||||
if (-not $success) {
|
||||
throw "Health check failed after $maxAttempts attempts"
|
||||
}
|
||||
|
||||
- name: Notify on success
|
||||
if: success()
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
const { repo, owner } = context.repo;
|
||||
const release = context.ref.replace('refs/tags/', '');
|
||||
await github.rest.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: context.issue.number,
|
||||
body: `✅ Successfully deployed ${release} to production!`
|
||||
});
|
||||
|
||||
- name: Notify on failure
|
||||
if: failure()
|
||||
uses: actions/github-script@v6
|
||||
with:
|
||||
script: |
|
||||
const { repo, owner } = context.repo;
|
||||
const release = context.ref.replace('refs/tags/', '');
|
||||
await github.rest.issues.createComment({
|
||||
owner,
|
||||
repo,
|
||||
issue_number: context.issue.number,
|
||||
body: `❌ Failed to deploy ${release} to production. Check the workflow logs for details.`
|
||||
});
|
||||
|
||||
@@ -5,14 +5,14 @@
|
||||
// @description API for managing Assetto Corsa Competizione dedicated servers
|
||||
//
|
||||
// @contact.name ACC Server Manager Support
|
||||
// @contact.url https://github.com/yourusername/acc-server-manager
|
||||
// @contact.url https://github.com/FJurmanovic/acc-server-manager
|
||||
//
|
||||
// @license.name MIT
|
||||
// @license.url https://opensource.org/licenses/MIT
|
||||
//
|
||||
// @host localhost:3000
|
||||
// @BasePath /api/v1
|
||||
// @schemes http https
|
||||
// @host acc-api.jurmanovic.com
|
||||
// @BasePath /v1
|
||||
// @schemes https
|
||||
//
|
||||
// @securityDefinitions.apikey BearerAuth
|
||||
// @in header
|
||||
|
||||
@@ -58,7 +58,7 @@ func NewConfigController(as *service.ConfigService, routeGroups *common.RouteGro
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "Server or config file not found"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/server/{id}/config/{file} [put]
|
||||
// @Router /server/{id}/config/{file} [put]
|
||||
func (ac *ConfigController) UpdateConfig(c *fiber.Ctx) error {
|
||||
restart := c.QueryBool("restart")
|
||||
serverID := c.Params("id")
|
||||
@@ -106,7 +106,7 @@ func (ac *ConfigController) UpdateConfig(c *fiber.Ctx) error {
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "Server or config file not found"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/server/{id}/config/{file} [get]
|
||||
// @Router /server/{id}/config/{file} [get]
|
||||
func (ac *ConfigController) GetConfig(c *fiber.Ctx) error {
|
||||
Model, err := ac.service.GetConfig(c)
|
||||
if err != nil {
|
||||
@@ -130,7 +130,7 @@ func (ac *ConfigController) GetConfig(c *fiber.Ctx) error {
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "Server not found"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/server/{id}/config [get]
|
||||
// @Router /server/{id}/config [get]
|
||||
func (ac *ConfigController) GetConfigs(c *fiber.Ctx) error {
|
||||
Model, err := ac.service.GetConfigs(c)
|
||||
if err != nil {
|
||||
|
||||
@@ -20,7 +20,12 @@ func InitializeControllers(c *dig.Container) {
|
||||
logging.Panic("unable to initialize auth middleware")
|
||||
}
|
||||
|
||||
err := c.Invoke(NewServiceControlController)
|
||||
err := c.Invoke(NewSystemController)
|
||||
if err != nil {
|
||||
logging.Panic("unable to initialize system controller")
|
||||
}
|
||||
|
||||
err = c.Invoke(NewServiceControlController)
|
||||
if err != nil {
|
||||
logging.Panic("unable to initialize service control controller")
|
||||
}
|
||||
|
||||
@@ -46,7 +46,7 @@ func NewLookupController(as *service.LookupService, routeGroups *common.RouteGro
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/lookup/tracks [get]
|
||||
// @Router /lookup/tracks [get]
|
||||
func (ac *LookupController) GetTracks(c *fiber.Ctx) error {
|
||||
result, err := ac.service.GetTracks(c)
|
||||
if err != nil {
|
||||
@@ -66,7 +66,7 @@ func (ac *LookupController) GetTracks(c *fiber.Ctx) error {
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/lookup/car-models [get]
|
||||
// @Router /lookup/car-models [get]
|
||||
func (ac *LookupController) GetCarModels(c *fiber.Ctx) error {
|
||||
result, err := ac.service.GetCarModels(c)
|
||||
if err != nil {
|
||||
@@ -86,7 +86,7 @@ func (ac *LookupController) GetCarModels(c *fiber.Ctx) error {
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/lookup/driver-categories [get]
|
||||
// @Router /lookup/driver-categories [get]
|
||||
func (ac *LookupController) GetDriverCategories(c *fiber.Ctx) error {
|
||||
result, err := ac.service.GetDriverCategories(c)
|
||||
if err != nil {
|
||||
@@ -106,7 +106,7 @@ func (ac *LookupController) GetDriverCategories(c *fiber.Ctx) error {
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/lookup/cup-categories [get]
|
||||
// @Router /lookup/cup-categories [get]
|
||||
func (ac *LookupController) GetCupCategories(c *fiber.Ctx) error {
|
||||
result, err := ac.service.GetCupCategories(c)
|
||||
if err != nil {
|
||||
@@ -126,7 +126,7 @@ func (ac *LookupController) GetCupCategories(c *fiber.Ctx) error {
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/lookup/session-types [get]
|
||||
// @Router /lookup/session-types [get]
|
||||
func (ac *LookupController) GetSessionTypes(c *fiber.Ctx) error {
|
||||
result, err := ac.service.GetSessionTypes(c)
|
||||
if err != nil {
|
||||
|
||||
@@ -139,6 +139,18 @@ func (mc *MembershipController) ListUsers(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
// GetUser gets a single user by ID.
|
||||
// @Summary Get user by ID
|
||||
// @Description Get detailed information about a specific user
|
||||
// @Tags User Management
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path string true "User ID (UUID format)"
|
||||
// @Success 200 {object} model.User "User details"
|
||||
// @Failure 400 {object} error_handler.ErrorResponse "Invalid user ID format"
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "User not found"
|
||||
// @Security BearerAuth
|
||||
// @Router /membership/{id} [get]
|
||||
func (mc *MembershipController) GetUser(c *fiber.Ctx) error {
|
||||
id, err := uuid.Parse(c.Params("id"))
|
||||
if err != nil {
|
||||
@@ -154,6 +166,16 @@ func (mc *MembershipController) GetUser(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
// GetMe returns the currently authenticated user's details.
|
||||
// @Summary Get current user details
|
||||
// @Description Get details of the currently authenticated user
|
||||
// @Tags Authentication
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {object} model.User "Current user details"
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "User not found"
|
||||
// @Security BearerAuth
|
||||
// @Router /auth/me [get]
|
||||
func (mc *MembershipController) GetMe(c *fiber.Ctx) error {
|
||||
userID, ok := c.Locals("userID").(string)
|
||||
if !ok || userID == "" {
|
||||
@@ -172,6 +194,19 @@ func (mc *MembershipController) GetMe(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
// DeleteUser deletes a user.
|
||||
// @Summary Delete user
|
||||
// @Description Delete a specific user by ID
|
||||
// @Tags User Management
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path string true "User ID (UUID format)"
|
||||
// @Success 204 "User successfully deleted"
|
||||
// @Failure 400 {object} error_handler.ErrorResponse "Invalid user ID format"
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 403 {object} error_handler.ErrorResponse "Insufficient permissions"
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "User not found"
|
||||
// @Security BearerAuth
|
||||
// @Router /membership/{id} [delete]
|
||||
func (mc *MembershipController) DeleteUser(c *fiber.Ctx) error {
|
||||
id, err := uuid.Parse(c.Params("id"))
|
||||
if err != nil {
|
||||
@@ -187,6 +222,20 @@ func (mc *MembershipController) DeleteUser(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
// UpdateUser updates a user.
|
||||
// @Summary Update user
|
||||
// @Description Update user details by ID
|
||||
// @Tags User Management
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path string true "User ID (UUID format)"
|
||||
// @Param user body service.UpdateUserRequest true "Updated user details"
|
||||
// @Success 200 {object} model.User "Updated user details"
|
||||
// @Failure 400 {object} error_handler.ErrorResponse "Invalid request body or ID format"
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 403 {object} error_handler.ErrorResponse "Insufficient permissions"
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "User not found"
|
||||
// @Security BearerAuth
|
||||
// @Router /membership/{id} [put]
|
||||
func (mc *MembershipController) UpdateUser(c *fiber.Ctx) error {
|
||||
id, err := uuid.Parse(c.Params("id"))
|
||||
if err != nil {
|
||||
@@ -207,6 +256,17 @@ func (mc *MembershipController) UpdateUser(c *fiber.Ctx) error {
|
||||
}
|
||||
|
||||
// GetRoles returns all available roles.
|
||||
// @Summary Get all roles
|
||||
// @Description Get a list of all available user roles
|
||||
// @Tags User Management
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Success 200 {array} model.Role "List of roles"
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 403 {object} error_handler.ErrorResponse "Insufficient permissions"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /membership/roles [get]
|
||||
func (mc *MembershipController) GetRoles(c *fiber.Ctx) error {
|
||||
roles, err := mc.service.GetAllRoles(c.UserContext())
|
||||
if err != nil {
|
||||
|
||||
@@ -50,7 +50,7 @@ func NewServerController(ss *service.ServerService, routeGroups *common.RouteGro
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /server [get]
|
||||
// @Router /api/server [get]
|
||||
func (ac *ServerController) GetAllApi(c *fiber.Ctx) error {
|
||||
var filter model.ServerFilter
|
||||
if err := common.ParseQueryFilter(c, &filter); err != nil {
|
||||
@@ -79,7 +79,7 @@ func (ac *ServerController) GetAllApi(c *fiber.Ctx) error {
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/server [get]
|
||||
// @Router /server [get]
|
||||
func (ac *ServerController) GetAll(c *fiber.Ctx) error {
|
||||
var filter model.ServerFilter
|
||||
if err := common.ParseQueryFilter(c, &filter); err != nil {
|
||||
@@ -105,7 +105,7 @@ func (ac *ServerController) GetAll(c *fiber.Ctx) error {
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "Server not found"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/server/{id} [get]
|
||||
// @Router /server/{id} [get]
|
||||
func (ac *ServerController) GetById(c *fiber.Ctx) error {
|
||||
serverIDStr := c.Params("id")
|
||||
serverID, err := uuid.Parse(serverIDStr)
|
||||
@@ -133,7 +133,7 @@ func (ac *ServerController) GetById(c *fiber.Ctx) error {
|
||||
// @Failure 403 {object} error_handler.ErrorResponse "Insufficient permissions"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/server [post]
|
||||
// @Router /server [post]
|
||||
func (ac *ServerController) CreateServer(c *fiber.Ctx) error {
|
||||
server := new(model.Server)
|
||||
if err := c.BodyParser(server); err != nil {
|
||||
@@ -161,7 +161,7 @@ func (ac *ServerController) CreateServer(c *fiber.Ctx) error {
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "Server not found"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/server/{id} [put]
|
||||
// @Router /server/{id} [put]
|
||||
func (ac *ServerController) UpdateServer(c *fiber.Ctx) error {
|
||||
serverIDStr := c.Params("id")
|
||||
serverID, err := uuid.Parse(serverIDStr)
|
||||
@@ -181,7 +181,21 @@ func (ac *ServerController) UpdateServer(c *fiber.Ctx) error {
|
||||
return c.JSON(server)
|
||||
}
|
||||
|
||||
// DeleteServer deletes a server
|
||||
// DeleteServer deletes an existing server
|
||||
// @Summary Delete an ACC server
|
||||
// @Description Delete an existing ACC server
|
||||
// @Tags Server
|
||||
// @Accept json
|
||||
// @Produce json
|
||||
// @Param id path string true "Server ID (UUID format)"
|
||||
// @Success 200 {object} object "Deleted server details"
|
||||
// @Failure 400 {object} error_handler.ErrorResponse "Invalid server data or ID"
|
||||
// @Failure 401 {object} error_handler.ErrorResponse "Unauthorized"
|
||||
// @Failure 403 {object} error_handler.ErrorResponse "Insufficient permissions"
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "Server not found"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /server/{id} [delete]
|
||||
func (ac *ServerController) DeleteServer(c *fiber.Ctx) error {
|
||||
serverIDStr := c.Params("id")
|
||||
serverID, err := uuid.Parse(serverIDStr)
|
||||
|
||||
@@ -51,7 +51,7 @@ func NewServiceControlController(as *service.ServiceControlService, routeGroups
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "Service not found"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/service-control/{service} [get]
|
||||
// @Router /server/{id}/service/{service} [get]
|
||||
func (ac *ServiceControlController) getStatus(c *fiber.Ctx) error {
|
||||
id := c.Params("id")
|
||||
c.Locals("serverId", id)
|
||||
@@ -78,7 +78,7 @@ func (ac *ServiceControlController) getStatus(c *fiber.Ctx) error {
|
||||
// @Failure 409 {object} error_handler.ErrorResponse "Service already running"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/service-control/start [post]
|
||||
// @Router /server/{id}/service/start [post]
|
||||
func (ac *ServiceControlController) startServer(c *fiber.Ctx) error {
|
||||
id := c.Params("id")
|
||||
c.Locals("serverId", id)
|
||||
@@ -105,7 +105,7 @@ func (ac *ServiceControlController) startServer(c *fiber.Ctx) error {
|
||||
// @Failure 409 {object} error_handler.ErrorResponse "Service already stopped"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/service-control/stop [post]
|
||||
// @Router /server/{id}/service/stop [post]
|
||||
func (ac *ServiceControlController) stopServer(c *fiber.Ctx) error {
|
||||
id := c.Params("id")
|
||||
c.Locals("serverId", id)
|
||||
@@ -131,7 +131,7 @@ func (ac *ServiceControlController) stopServer(c *fiber.Ctx) error {
|
||||
// @Failure 404 {object} error_handler.ErrorResponse "Service not found"
|
||||
// @Failure 500 {object} error_handler.ErrorResponse "Internal server error"
|
||||
// @Security BearerAuth
|
||||
// @Router /v1/service-control/restart [post]
|
||||
// @Router /server/{id}/service/restart [post]
|
||||
func (ac *ServiceControlController) restartServer(c *fiber.Ctx) error {
|
||||
id := c.Params("id")
|
||||
c.Locals("serverId", id)
|
||||
|
||||
@@ -42,7 +42,7 @@ func NewStateHistoryController(as *service.StateHistoryService, routeGroups *com
|
||||
// @Description Return StateHistorys
|
||||
// @Tags StateHistory
|
||||
// @Success 200 {array} string
|
||||
// @Router /v1/state-history [get]
|
||||
// @Router /state-history [get]
|
||||
func (ac *StateHistoryController) GetAll(c *fiber.Ctx) error {
|
||||
var filter model.StateHistoryFilter
|
||||
if err := common.ParseQueryFilter(c, &filter); err != nil {
|
||||
@@ -63,7 +63,7 @@ func (ac *StateHistoryController) GetAll(c *fiber.Ctx) error {
|
||||
// @Description Return StateHistorys
|
||||
// @Tags StateHistory
|
||||
// @Success 200 {array} string
|
||||
// @Router /v1/state-history/statistics [get]
|
||||
// @Router /state-history/statistics [get]
|
||||
func (ac *StateHistoryController) GetStatistics(c *fiber.Ctx) error {
|
||||
var filter model.StateHistoryFilter
|
||||
if err := common.ParseQueryFilter(c, &filter); err != nil {
|
||||
|
||||
@@ -2,6 +2,7 @@ package controller
|
||||
|
||||
import (
|
||||
"acc-server-manager/local/utl/common"
|
||||
"acc-server-manager/local/utl/configs"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
)
|
||||
@@ -30,9 +31,9 @@ func NewSystemController(routeGroups *common.RouteGroups) *SystemController {
|
||||
//
|
||||
// @Summary Return service control status
|
||||
// @Description Return service control status
|
||||
// @Tags service-control
|
||||
// @Tags system
|
||||
// @Success 200 {array} string
|
||||
// @Router /v1/service-control [get]
|
||||
// @Router /system/health [get]
|
||||
func (ac *SystemController) getFirst(c *fiber.Ctx) error {
|
||||
return c.SendStatus(fiber.StatusOK)
|
||||
return c.SendString(configs.Version)
|
||||
}
|
||||
|
||||
@@ -8,7 +8,7 @@ import (
|
||||
)
|
||||
|
||||
var (
|
||||
Version = "0.0.1"
|
||||
Version = "0.10.3"
|
||||
Prefix = "v1"
|
||||
Secret string
|
||||
SecretCode string
|
||||
|
||||
921
swagger/docs.go
921
swagger/docs.go
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,4 +1,4 @@
|
||||
basePath: /api/v1
|
||||
basePath: /v1
|
||||
definitions:
|
||||
error_handler.ErrorResponse:
|
||||
properties:
|
||||
@@ -103,11 +103,20 @@ definitions:
|
||||
username:
|
||||
type: string
|
||||
type: object
|
||||
host: localhost:3000
|
||||
service.UpdateUserRequest:
|
||||
properties:
|
||||
password:
|
||||
type: string
|
||||
roleId:
|
||||
type: string
|
||||
username:
|
||||
type: string
|
||||
type: object
|
||||
host: acc-api.jurmanovic.com
|
||||
info:
|
||||
contact:
|
||||
name: ACC Server Manager Support
|
||||
url: https://github.com/yourusername/acc-server-manager
|
||||
url: https://github.com/FJurmanovic/acc-server-manager
|
||||
description: API for managing Assetto Corsa Competizione dedicated servers
|
||||
license:
|
||||
name: MIT
|
||||
@@ -115,6 +124,62 @@ info:
|
||||
title: ACC Server Manager API
|
||||
version: "1.0"
|
||||
paths:
|
||||
/api/server:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all ACC servers with filtering options
|
||||
parameters:
|
||||
- in: query
|
||||
name: name
|
||||
type: string
|
||||
- in: query
|
||||
name: page
|
||||
type: integer
|
||||
- in: query
|
||||
name: pageSize
|
||||
type: integer
|
||||
- in: query
|
||||
name: serverID
|
||||
type: string
|
||||
- in: query
|
||||
name: serviceName
|
||||
type: string
|
||||
- in: query
|
||||
name: sortBy
|
||||
type: string
|
||||
- in: query
|
||||
name: sortDesc
|
||||
type: boolean
|
||||
- in: query
|
||||
name: status
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of servers
|
||||
schema:
|
||||
items:
|
||||
$ref: '#/definitions/model.ServerAPI'
|
||||
type: array
|
||||
"400":
|
||||
description: Invalid filter parameters
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: List all servers (API format)
|
||||
tags:
|
||||
- Server
|
||||
/auth/login:
|
||||
post:
|
||||
consumes:
|
||||
@@ -157,6 +222,198 @@ paths:
|
||||
summary: User login
|
||||
tags:
|
||||
- Authentication
|
||||
/auth/me:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get details of the currently authenticated user
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: Current user details
|
||||
schema:
|
||||
$ref: '#/definitions/model.User'
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"404":
|
||||
description: User not found
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get current user details
|
||||
tags:
|
||||
- Authentication
|
||||
/lookup/car-models:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all available ACC car models with their identifiers
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of car models
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
class:
|
||||
type: string
|
||||
id:
|
||||
type: string
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get available car models
|
||||
tags:
|
||||
- Lookups
|
||||
/lookup/cup-categories:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all available racing cup categories
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of cup categories
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
id:
|
||||
type: number
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get cup categories
|
||||
tags:
|
||||
- Lookups
|
||||
/lookup/driver-categories:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all driver categories (Bronze, Silver, Gold, Platinum)
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of driver categories
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
description:
|
||||
type: string
|
||||
id:
|
||||
type: number
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get driver categories
|
||||
tags:
|
||||
- Lookups
|
||||
/lookup/session-types:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all available session types (Practice, Qualifying,
|
||||
Race)
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of session types
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
code:
|
||||
type: string
|
||||
id:
|
||||
type: string
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get session types
|
||||
tags:
|
||||
- Lookups
|
||||
/lookup/tracks:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all available ACC tracks with their identifiers
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of tracks
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
id:
|
||||
type: string
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get available tracks
|
||||
tags:
|
||||
- Lookups
|
||||
/membership:
|
||||
get:
|
||||
consumes:
|
||||
@@ -238,117 +495,141 @@ paths:
|
||||
summary: Create a new user
|
||||
tags:
|
||||
- User Management
|
||||
/server:
|
||||
get:
|
||||
/membership/{id}:
|
||||
delete:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all ACC servers with filtering options
|
||||
description: Delete a specific user by ID
|
||||
parameters:
|
||||
- in: query
|
||||
name: name
|
||||
type: string
|
||||
- in: query
|
||||
name: page
|
||||
type: integer
|
||||
- in: query
|
||||
name: pageSize
|
||||
type: integer
|
||||
- in: query
|
||||
name: serverID
|
||||
type: string
|
||||
- in: query
|
||||
name: serviceName
|
||||
type: string
|
||||
- in: query
|
||||
name: sortBy
|
||||
type: string
|
||||
- in: query
|
||||
name: sortDesc
|
||||
type: boolean
|
||||
- in: query
|
||||
name: status
|
||||
- description: User ID (UUID format)
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of servers
|
||||
schema:
|
||||
items:
|
||||
$ref: '#/definitions/model.ServerAPI'
|
||||
type: array
|
||||
"204":
|
||||
description: User successfully deleted
|
||||
"400":
|
||||
description: Invalid filter parameters
|
||||
description: Invalid user ID format
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
"403":
|
||||
description: Insufficient permissions
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"404":
|
||||
description: User not found
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: List all servers (API format)
|
||||
summary: Delete user
|
||||
tags:
|
||||
- Server
|
||||
/v1/lookup/car-models:
|
||||
- User Management
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all available ACC car models with their identifiers
|
||||
description: Get detailed information about a specific user
|
||||
parameters:
|
||||
- description: User ID (UUID format)
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of car models
|
||||
description: User details
|
||||
schema:
|
||||
$ref: '#/definitions/model.User'
|
||||
"400":
|
||||
description: Invalid user ID format
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"404":
|
||||
description: User not found
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get user by ID
|
||||
tags:
|
||||
- User Management
|
||||
put:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Update user details by ID
|
||||
parameters:
|
||||
- description: User ID (UUID format)
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: string
|
||||
- description: Updated user details
|
||||
in: body
|
||||
name: user
|
||||
required: true
|
||||
schema:
|
||||
$ref: '#/definitions/service.UpdateUserRequest'
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: Updated user details
|
||||
schema:
|
||||
$ref: '#/definitions/model.User'
|
||||
"400":
|
||||
description: Invalid request body or ID format
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"403":
|
||||
description: Insufficient permissions
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"404":
|
||||
description: User not found
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Update user
|
||||
tags:
|
||||
- User Management
|
||||
/membership/roles:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all available user roles
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of roles
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
class:
|
||||
type: string
|
||||
id:
|
||||
type: string
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
$ref: '#/definitions/model.Role'
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get available car models
|
||||
tags:
|
||||
- Lookups
|
||||
/v1/lookup/cup-categories:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all available racing cup categories
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of cup categories
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
id:
|
||||
type: number
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
"403":
|
||||
description: Insufficient permissions
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
@@ -357,111 +638,10 @@ paths:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get cup categories
|
||||
summary: Get all roles
|
||||
tags:
|
||||
- Lookups
|
||||
/v1/lookup/driver-categories:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all driver categories (Bronze, Silver, Gold, Platinum)
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of driver categories
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
description:
|
||||
type: string
|
||||
id:
|
||||
type: number
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get driver categories
|
||||
tags:
|
||||
- Lookups
|
||||
/v1/lookup/session-types:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all available session types (Practice, Qualifying,
|
||||
Race)
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of session types
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
code:
|
||||
type: string
|
||||
id:
|
||||
type: string
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get session types
|
||||
tags:
|
||||
- Lookups
|
||||
/v1/lookup/tracks:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Get a list of all available ACC tracks with their identifiers
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: List of tracks
|
||||
schema:
|
||||
items:
|
||||
properties:
|
||||
id:
|
||||
type: string
|
||||
name:
|
||||
type: string
|
||||
type: object
|
||||
type: array
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Get available tracks
|
||||
tags:
|
||||
- Lookups
|
||||
/v1/server:
|
||||
- User Management
|
||||
/server:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
@@ -556,7 +736,49 @@ paths:
|
||||
summary: Create a new ACC server
|
||||
tags:
|
||||
- Server
|
||||
/v1/server/{id}:
|
||||
/server/{id}:
|
||||
delete:
|
||||
consumes:
|
||||
- application/json
|
||||
description: Delete an existing ACC server
|
||||
parameters:
|
||||
- description: Server ID (UUID format)
|
||||
in: path
|
||||
name: id
|
||||
required: true
|
||||
type: string
|
||||
produces:
|
||||
- application/json
|
||||
responses:
|
||||
"200":
|
||||
description: Deleted server details
|
||||
schema:
|
||||
type: object
|
||||
"400":
|
||||
description: Invalid server data or ID
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"401":
|
||||
description: Unauthorized
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"403":
|
||||
description: Insufficient permissions
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"404":
|
||||
description: Server not found
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
"500":
|
||||
description: Internal server error
|
||||
schema:
|
||||
$ref: '#/definitions/error_handler.ErrorResponse'
|
||||
security:
|
||||
- BearerAuth: []
|
||||
summary: Delete an ACC server
|
||||
tags:
|
||||
- Server
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
@@ -643,7 +865,7 @@ paths:
|
||||
summary: Update an ACC server
|
||||
tags:
|
||||
- Server
|
||||
/v1/server/{id}/config:
|
||||
/server/{id}/config:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
@@ -688,7 +910,7 @@ paths:
|
||||
summary: List available configuration files
|
||||
tags:
|
||||
- Server Configuration
|
||||
/v1/server/{id}/config/{file}:
|
||||
/server/{id}/config/{file}:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
@@ -792,20 +1014,7 @@ paths:
|
||||
summary: Update server configuration file
|
||||
tags:
|
||||
- Server Configuration
|
||||
/v1/service-control:
|
||||
get:
|
||||
description: Return service control status
|
||||
responses:
|
||||
"200":
|
||||
description: OK
|
||||
schema:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
summary: Return service control status
|
||||
tags:
|
||||
- service-control
|
||||
/v1/service-control/{service}:
|
||||
/server/{id}/service/{service}:
|
||||
get:
|
||||
consumes:
|
||||
- application/json
|
||||
@@ -849,7 +1058,7 @@ paths:
|
||||
summary: Get service status
|
||||
tags:
|
||||
- Service Control
|
||||
/v1/service-control/restart:
|
||||
/server/{id}/service/restart:
|
||||
post:
|
||||
consumes:
|
||||
- application/json
|
||||
@@ -899,7 +1108,7 @@ paths:
|
||||
summary: Restart a Windows service
|
||||
tags:
|
||||
- Service Control
|
||||
/v1/service-control/start:
|
||||
/server/{id}/service/start:
|
||||
post:
|
||||
consumes:
|
||||
- application/json
|
||||
@@ -953,7 +1162,7 @@ paths:
|
||||
summary: Start a Windows service
|
||||
tags:
|
||||
- Service Control
|
||||
/v1/service-control/stop:
|
||||
/server/{id}/service/stop:
|
||||
post:
|
||||
consumes:
|
||||
- application/json
|
||||
@@ -1007,7 +1216,7 @@ paths:
|
||||
summary: Stop a Windows service
|
||||
tags:
|
||||
- Service Control
|
||||
/v1/state-history:
|
||||
/state-history:
|
||||
get:
|
||||
description: Return StateHistorys
|
||||
responses:
|
||||
@@ -1020,7 +1229,7 @@ paths:
|
||||
summary: Return StateHistorys
|
||||
tags:
|
||||
- StateHistory
|
||||
/v1/state-history/statistics:
|
||||
/state-history/statistics:
|
||||
get:
|
||||
description: Return StateHistorys
|
||||
responses:
|
||||
@@ -1033,8 +1242,20 @@ paths:
|
||||
summary: Return StateHistorys
|
||||
tags:
|
||||
- StateHistory
|
||||
/system/health:
|
||||
get:
|
||||
description: Return service control status
|
||||
responses:
|
||||
"200":
|
||||
description: OK
|
||||
schema:
|
||||
items:
|
||||
type: string
|
||||
type: array
|
||||
summary: Return service control status
|
||||
tags:
|
||||
- system
|
||||
schemes:
|
||||
- http
|
||||
- https
|
||||
securityDefinitions:
|
||||
BearerAuth:
|
||||
|
||||
Reference in New Issue
Block a user