Added: Postgrest Endpoint for Learnlytics Database; WIP: Swagger for Learnlytics endpoint
This commit is contained in:
@@ -2,14 +2,15 @@
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
|
||||
{
|
||||
# Swagger UI service
|
||||
systemd.services.swagger-ui = {
|
||||
description = "Swagger UI for PostgREST API";
|
||||
after = [ "postgrest.service" "network.target" ];
|
||||
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";
|
||||
@@ -18,54 +19,108 @@
|
||||
User = "swagger";
|
||||
};
|
||||
};
|
||||
|
||||
# Create swagger user
|
||||
users.users.swagger = {
|
||||
isSystemUser = true;
|
||||
group = "swagger";
|
||||
users = {
|
||||
users.swagger = {
|
||||
isSystemUser = true;
|
||||
group = "swagger";
|
||||
};
|
||||
groups.swagger = { };
|
||||
};
|
||||
|
||||
users.groups.swagger = {};
|
||||
|
||||
# Setup Swagger UI directory
|
||||
systemd.tmpfiles.rules = [
|
||||
"d /var/lib/swagger-ui 0755 swagger swagger"
|
||||
];
|
||||
|
||||
# Create Swagger UI index.html that points to PostgREST OpenAPI
|
||||
environment.etc."swagger-ui-init/index.html".text = ''
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<title>Swagger UI - PostgREST 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>
|
||||
SwaggerUIBundle({
|
||||
url: "http://localhost:3000/openapi.json",
|
||||
dom_id: '#swagger-ui',
|
||||
presets: [
|
||||
SwaggerUIBundle.presets.apis,
|
||||
SwaggerUIStandalonePreset
|
||||
],
|
||||
layout: "StandaloneLayout"
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
'';
|
||||
# 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
|
||||
cp ${pkgs.swagger-ui}/share/swagger-ui/* /var/lib/swagger-ui/ 2>/dev/null || true
|
||||
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
|
||||
'';
|
||||
|
||||
@@ -74,7 +129,6 @@
|
||||
|
||||
# Include packages
|
||||
environment.systemPackages = with pkgs; [
|
||||
swagger-ui
|
||||
nodePackages.http-server
|
||||
];
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user