feat(api): Add Swagger UI for v1 endpoints

Serve interactive docs at /api, covering only the current /api/v1/*
endpoints. Deprecated /api/diyanet/* endpoints are left undocumented.
This commit is contained in:
abdus committed 2026-10-08 21:29:07 +02:00
1 parent c3bf3eca8d
commit cec7f1566e
3 files changed
+193

No files matched your search

+10
View File
@@ -261,6 +261,16 @@ func New(services Services) *fiber.App {
return ctx.JSON(mapped) return ctx.JSON(mapped)
}) })
app.Get("/api/openapi.yaml", func(ctx fiber.Ctx) error {
ctx.Response().Header.Set(fiber.HeaderContentType, "application/yaml")
return ctx.Send(openapiSpec)
})
app.Get("/api", func(ctx fiber.Ctx) error {
ctx.Response().Header.Set(fiber.HeaderContentType, fiber.MIMETextHTMLCharsetUTF8)
return ctx.SendString(swaggerHTML)
})
app.Use("/", static.New("", static.Config{FS: templates.FS()})) app.Use("/", static.New("", static.Config{FS: templates.FS()}))
return app return app
+27
View File
@@ -0,0 +1,27 @@
package api
import _ "embed"
//go:embed openapi.yaml
var openapiSpec []byte
const swaggerHTML = `<!doctype html>
<html>
<head>
<meta charset="UTF-8">
<title>Prayer Times API</title>
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.33.1/swagger-ui.css">
</head>
<body>
<div id="swagger-ui"></div>
<script src="https://cdn.jsdelivr.net/npm/swagger-ui-dist@5.33.1/swagger-ui-bundle.js"></script>
<script>
window.onload = () => {
SwaggerUIBundle({
url: "/api/openapi.yaml",
dom_id: "#swagger-ui",
});
};
</script>
</body>
</html>`
+156
View File
@@ -0,0 +1,156 @@
openapi: 3.0.3
info:
title: Prayer Times API
version: "1"
description: Prayer times and location lookup, backed by Diyanet data.
externalDocs:
description: Source code
url: https://git.abdus.dev/abdus/prayertimes-go/
servers:
- url: /
paths:
/api/v1/diyanet/location:
get:
summary: Search locations
description: Search locations by free-text query, or find the nearest location to a coordinate pair.
parameters:
- name: query
in: query
description: Free-text location search. Mutually exclusive with latitude/longitude.
schema:
type: string
- name: latitude
in: query
description: Required together with longitude when query is omitted.
schema:
type: number
format: double
- name: longitude
in: query
description: Required together with latitude when query is omitted.
schema:
type: number
format: double
responses:
"200":
description: Matching locations.
content:
application/json:
schema:
type: object
properties:
locations:
type: array
items:
$ref: "#/components/schemas/Location"
"400":
description: Missing both query and coordinates.
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
/api/v1/diyanet/prayertimes:
get:
summary: Get prayer times
description: Get prayer times by location ID, or by coordinates.
parameters:
- name: location_id
in: query
description: Mutually exclusive with latitude/longitude.
schema:
type: string
- name: latitude
in: query
schema:
type: number
format: double
- name: longitude
in: query
schema:
type: number
format: double
- name: utc
in: query
description: Return timestamps in UTC instead of the location's local timezone.
schema:
type: boolean
default: false
responses:
"200":
description: Prayer times for the resolved location.
content:
application/json:
schema:
type: object
properties:
location:
$ref: "#/components/schemas/Location"
prayertimes:
type: array
items:
$ref: "#/components/schemas/PrayerTimes"
"400":
description: Missing both location_id and coordinates.
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
"422":
description: Invalid location.
content:
application/json:
schema:
$ref: "#/components/schemas/Error"
components:
schemas:
Location:
type: object
properties:
id:
type: integer
name:
type: string
ascii_name:
type: string
alternate_names:
type: string
country_code:
type: string
latitude:
type: number
format: double
longitude:
type: number
format: double
timezone:
type: string
PrayerTimes:
type: object
properties:
date:
type: string
format: date
date_hijri:
type: string
fajr:
type: string
example: "05:47"
sunrise:
type: string
dhuhr:
type: string
asr:
type: string
sunset:
type: string
maghrib:
type: string
isha:
type: string
Error:
type: object
properties:
message:
type: string