Files
cyper-rpi/hosts/cyper-pi-1/swagger.nix

135 lines
4.4 KiB
Nix

{
pkgs,
...
}:
{
# Swagger UI service
systemd.services.swagger-ui = {
description = "Swagger UI for PostgREST APIs";
after = [
"postgrest.service"
"network.target"
];
wantedBy = [ "multi-user.target" ];
serviceConfig = {
Type = "simple";
ExecStart = "${pkgs.nodePackages.http-server}/bin/http-server /var/lib/swagger-ui -p 8080 -c-1 --cors";
Restart = "on-failure";
RestartSec = 5;
User = "swagger";
};
};
# Create swagger user
users = {
users.swagger = {
isSystemUser = true;
group = "swagger";
};
groups.swagger = { };
};
# Setup Swagger UI directory
systemd.tmpfiles.rules = [
"d /var/lib/swagger-ui 0755 swagger swagger"
];
# Index page to select which API
environment.etc = {
"swagger-ui-init/index.html".text = ''
<!DOCTYPE html>
<html>
<head>
<title>PostgREST APIs</title>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
body { font-family: Arial; margin: 40px; }
a { display: block; margin: 10px 0; padding: 10px; background: #007bff; color: white; text-decoration: none; border-radius: 5px; width: 200px; text-align: center; }
a:hover { background: #0056b3; }
</style>
</head>
<body>
<h1>PostgREST APIs</h1>
<a href="/default">Default API (port 3000)</a>
<a href="/learnlytics">Learnlytics API (port 3001)</a>
</body>
</html>
'';
# Swagger UI for default API
"swagger-ui-init/default/index.html".text = ''
<!DOCTYPE html>
<html>
<head>
<title>Swagger UI - Default API</title>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui.css">
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui-bundle.js"></script>
<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui-standalone-preset.js"></script>
<script>
const host = window.location.host.split(':')[0];
SwaggerUIBundle({
url: "http://" + host + ":3000",
dom_id: '#swagger-ui',
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
layout: "StandaloneLayout"
})
</script>
</body>
</html>
'';
# Swagger UI for learnlytics API
"swagger-ui-init/learnlytics/index.html".text = ''
<!DOCTYPE html>
<html>
<head>
<title>Swagger UI - Learnlytics API</title>
<meta charset="utf-8"/>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui.css">
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui-bundle.js"></script>
<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@3/swagger-ui-standalone-preset.js"></script>
<script>
const host = window.location.host.split(':')[0];
SwaggerUIBundle({
url: "http://" + host + ":3001",
dom_id: '#swagger-ui',
presets: [
SwaggerUIBundle.presets.apis,
SwaggerUIStandalonePreset
],
layout: "StandaloneLayout"
})
</script>
</body>
</html>
'';
};
# Copy Swagger UI files on startup
system.activationScripts.swagger-ui-setup = ''
mkdir -p /var/lib/swagger-ui/default /var/lib/swagger-ui/learnlytics
cp /etc/swagger-ui-init/index.html /var/lib/swagger-ui/index.html
cp /etc/swagger-ui-init/default/index.html /var/lib/swagger-ui/default/index.html
cp /etc/swagger-ui-init/learnlytics/index.html /var/lib/swagger-ui/learnlytics/index.html
chown -R swagger:swagger /var/lib/swagger-ui
'';
# Open firewall port for Swagger UI
networking.firewall.allowedTCPPorts = [ 8080 ];
# Include packages
environment.systemPackages = with pkgs; [
nodePackages.http-server
];
}