api docs, generator
This commit is contained in:
1521
templates/api.html
1521
templates/api.html
File diff suppressed because it is too large
Load Diff
@@ -19,10 +19,27 @@
|
||||
{{ app_name }}
|
||||
{% endif %}
|
||||
</a>
|
||||
<div>
|
||||
<a href="/" class="btn btn-sm btn-outline-secondary me-2">Home</a>
|
||||
<a href="/api-docs" class="btn btn-sm btn-outline-primary">API Docs</a>
|
||||
</div>
|
||||
<div class="d-flex align-items-center">
|
||||
|
||||
<!-- API status -->
|
||||
<div class="me-3 d-flex align-items-center">
|
||||
<span id="apiStatusDot" class="status-dot bg-secondary"></span>
|
||||
<small id="apiStatusText" class="ms-2 text-muted">API</small>
|
||||
</div>
|
||||
|
||||
<a href="/" class="btn btn-sm btn-outline-secondary me-2">
|
||||
<i class="fas fa-home me-1"></i>Home
|
||||
</a>
|
||||
|
||||
<a href="/api-docs" class="btn btn-sm btn-outline-primary me-2">
|
||||
<i class="fas fa-book me-1"></i>API Docs
|
||||
</a>
|
||||
|
||||
<a href="/generator" class="btn btn-sm btn-outline-dark">
|
||||
<i class="fas fa-code me-1"></i>Script Generator
|
||||
</a>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
@@ -42,6 +59,7 @@
|
||||
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
|
||||
<script src="{{ url_for('static', filename='js/app.js') }}?v={{ js_hash }}"></script>
|
||||
<script src="{{ url_for('static', filename='js/base.js') }}?v={{ js_hash }}"></script>
|
||||
{% block scripts %}{% endblock %}
|
||||
</body>
|
||||
</html>
|
||||
|
||||
62
templates/error.html
Normal file
62
templates/error.html
Normal file
@@ -0,0 +1,62 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}{{ status }} - {{ title }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container mt-5">
|
||||
<div class="row">
|
||||
<div class="col-lg-8 mx-auto text-center">
|
||||
|
||||
<div class="mb-4">
|
||||
<div class="display-4 fw-bold text-danger">{{ status }}</div>
|
||||
<h3 class="mb-2">{{ title }}</h3>
|
||||
<p class="text-muted mb-3">{{ message }}</p>
|
||||
|
||||
<div class="alert alert-light border text-start">
|
||||
<div class="d-flex justify-content-between align-items-center flex-wrap gap-2">
|
||||
<div>
|
||||
<div class="small text-muted">Path</div>
|
||||
<code>{{ path }}</code>
|
||||
</div>
|
||||
<div>
|
||||
<div class="small text-muted">Hint</div>
|
||||
{% if status == 405 %}
|
||||
<span class="badge bg-warning text-dark">Check HTTP method</span>
|
||||
{% elif status == 400 %}
|
||||
<span class="badge bg-warning text-dark">Check request body</span>
|
||||
{% elif status == 401 %}
|
||||
<span class="badge bg-warning text-dark">Auth required</span>
|
||||
{% elif status == 403 %}
|
||||
<span class="badge bg-warning text-dark">Permission denied</span>
|
||||
{% else %}
|
||||
<span class="badge bg-secondary">Check URL</span>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-center gap-2 flex-wrap">
|
||||
<a href="/" class="btn btn-primary">
|
||||
<i class="fas fa-home me-1"></i>Home
|
||||
</a>
|
||||
<a href="/api/docs" class="btn btn-outline-secondary">
|
||||
<i class="fas fa-book me-1"></i>API Docs
|
||||
</a>
|
||||
<a href="/generator" class="btn btn-outline-dark">
|
||||
<i class="fas fa-code me-1"></i>Script Generator
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<div class="mt-4 small text-muted">
|
||||
{% if path.startswith('/api/') %}
|
||||
API endpoints return JSON for programmatic clients.
|
||||
{% else %}
|
||||
If you expected an API response, use <code>/api/...</code>.
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
144
templates/generator.html
Normal file
144
templates/generator.html
Normal file
@@ -0,0 +1,144 @@
|
||||
{% extends "base.html" %}
|
||||
|
||||
{% block title %}Script Generator - {{ app_name }}{% endblock %}
|
||||
|
||||
{% block content %}
|
||||
<div class="container mt-4">
|
||||
<div class="row">
|
||||
<div class="col-lg-10 mx-auto">
|
||||
|
||||
<div class="mb-4">
|
||||
<h2>Script Generator</h2>
|
||||
<p class="text-muted mb-2">Generate ready-to-use integration scripts for this API.</p>
|
||||
|
||||
<div class="alert alert-info">
|
||||
<strong>Base URL:</strong> <code id="baseUrl"></code>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card mb-4">
|
||||
<div class="card-header bg-dark text-white">
|
||||
<strong><i class="fab fa-python me-2"></i>Python Generator</strong>
|
||||
<span class="ms-2 small text-white-50">raw / generate</span>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
|
||||
<div class="row g-3">
|
||||
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">Mode</label>
|
||||
<select id="pyMode" class="form-select form-select-sm">
|
||||
<option value="raw">Raw blocklist (TXT / CSV / JSON / JS)</option>
|
||||
<option value="generate">App config file (download)</option>
|
||||
</select>
|
||||
<div class="form-text">Preview endpoint is UI-only — not recommended for external automation.</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4">
|
||||
<label class="form-label">Countries (comma separated)</label>
|
||||
<input type="text" id="pyCountries" class="form-control form-control-sm" value="PL">
|
||||
<div class="form-text">Example: <code>PL</code> or <code>CN,RU</code></div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-2">
|
||||
<label class="form-label">Aggregate</label>
|
||||
<select id="pyAggregate" class="form-select form-select-sm">
|
||||
<option value="true">true</option>
|
||||
<option value="false">false</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-2">
|
||||
<label class="form-label">Use cache</label>
|
||||
<select id="pyCache" class="form-select form-select-sm">
|
||||
<option value="true">true</option>
|
||||
<option value="false">false</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- RAW options -->
|
||||
<div class="col-md-4" id="pyRawFormatBox">
|
||||
<label class="form-label">Raw format (app_type)</label>
|
||||
<select id="pyRawFormat" class="form-select form-select-sm">
|
||||
<option value="raw-cidr_txt">raw-cidr_txt (TXT)</option>
|
||||
<option value="raw-cidr_csv">raw-cidr_csv (CSV)</option>
|
||||
<option value="raw-cidr_json">raw-cidr_json (JSON)</option>
|
||||
</select>
|
||||
<div class="form-text">
|
||||
JS wrapper works only with <code>raw-cidr_json</code>.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-2" id="pyAsJsBox">
|
||||
<label class="form-label">as_js</label>
|
||||
<select id="pyAsJs" class="form-select form-select-sm">
|
||||
<option value="false">false</option>
|
||||
<option value="true">true</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<div class="col-md-3" id="pyJsVarBox">
|
||||
<label class="form-label">js_var</label>
|
||||
<input type="text" id="pyJsVar" class="form-control form-control-sm" value="geoipBlocklist">
|
||||
</div>
|
||||
|
||||
<!-- GENERATE options -->
|
||||
<div class="col-md-4" id="pyAppTypeBox" style="display:none;">
|
||||
<label class="form-label">app_type</label>
|
||||
<select id="pyAppType" class="form-select form-select-sm">
|
||||
<option value="haproxy">haproxy</option>
|
||||
<option value="apache">apache</option>
|
||||
<option value="nginx">nginx</option>
|
||||
</select>
|
||||
<div class="form-text">
|
||||
Avoid <code>nginx</code> + <code>map</code> for production.
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-md-4" id="pyAppVariantBox" style="display:none;">
|
||||
<label class="form-label">app_variant</label>
|
||||
<select id="pyAppVariant" class="form-select form-select-sm"></select>
|
||||
<div class="form-text" id="variantHint"></div>
|
||||
</div>
|
||||
|
||||
<div class="col-12 mt-2">
|
||||
<button class="btn btn-primary btn-sm" id="btnGenPy">
|
||||
<i class="fas fa-code me-1"></i>Generate
|
||||
</button>
|
||||
<button class="btn btn-outline-secondary btn-sm ms-2" id="btnCopyPy">
|
||||
<i class="fas fa-copy me-1"></i>Copy
|
||||
</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<hr>
|
||||
|
||||
<div class="code-wrap mt-2">
|
||||
<div class="code-wrap-header">
|
||||
<span><i class="fab fa-python me-2"></i>generated.py</span>
|
||||
<button class="btn btn-sm btn-outline-light" type="button" id="btnCopyPyTop">
|
||||
<i class="fas fa-copy me-1"></i>Copy
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<pre class="code-wrap-body"><code id="pythonScriptOutput"></code></pre>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="alert alert-secondary">
|
||||
<strong>Tip:</strong> If you need structured output for integrations, use <code>/api/generate/raw</code>.
|
||||
For ready-to-use app configs, use <code>/api/generate</code>.
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
||||
{% block scripts %}
|
||||
<script src="{{ url_for('static', filename='js/generator.js') }}?v={{ js_hash }}"></script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user