Updated to openapi 3.1

This commit is contained in:
2025-08-11 16:33:40 -04:00
parent 59e0236340
commit 3bf62ec4fb
3 changed files with 260 additions and 6 deletions

View File

@@ -26,6 +26,7 @@ dependencies {
implementation("io.ktor:ktor-server-default-headers")
implementation("io.ktor:ktor-server-core")
implementation("io.ktor:ktor-server-swagger")
implementation("io.ktor:ktor-server-cors")
implementation("io.ktor:ktor-server-auth")
implementation("io.ktor:ktor-server-auth-jwt")
implementation("io.ktor:ktor-server-content-negotiation")

View File

@@ -1,12 +1,22 @@
package codes.kalar
import io.ktor.http.*
import io.ktor.server.application.*
import io.ktor.server.plugins.contentnegotiation.*
import io.ktor.serialization.kotlinx.json.*
import io.ktor.server.engine.*
import io.ktor.server.netty.*
import io.ktor.server.plugins.cors.routing.*
import kotlinx.serialization.json.Json
fun main(args: Array<String>) {
io.ktor.server.netty.EngineMain.main(args)
embeddedServer(Netty, port = 8080) {
install(CORS) {
anyHost()
allowHeader(HttpHeaders.ContentType)
}
}.start(wait = true)
EngineMain.main(args)
}
fun Application.module() {
@@ -16,6 +26,7 @@ fun Application.module() {
isLenient = true
})
}
configureHTTP()
configureSecurity()
configureSerialization()

View File

@@ -1,10 +1,252 @@
openapi: "3.0.3"
openapi: 3.1.0
info:
title: "Application API"
description: "Application API"
version: "1.0.0"
title: "LMS APIs"
description: "Library Management System APIs"
version: "0.0.1"
servers:
- url: "http://0.0.0.0:8080"
paths:
/items:
$ref: "./endpoints/items.yaml"
get:
description: "Search for item in collection"
parameters:
- name: "title"
in: "path"
required: false
schema:
type: string
example: title=Dune-Messiah
- name: "id"
in: "path"
required: false
schema:
type: string
example: id=27
responses:
"200":
description: "OK"
content:
application/json:
schema:
$ref: "#/components/schemas/CollectionItem"
"400":
description: "Bad Request"
"404":
description: "Not Found"
post:
description: "The method to add items to the collection."
requestBody:
description: "A JSON object that represents an item."
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/CollectionItem"
responses:
"200":
description: "OK"
"400":
description: "Bad Request"
patch:
description: "The method to update an item."
requestBody:
description: "The JSON object that represents a modified item."
required: true
content:
application/json:
schema:
$ref: "#/components/schemas/CollectionItem"
responses:
"200":
description: "OK"
"400":
description: "Bad Request"
"404":
description: "Not Found"
delete:
description: "The method to soft delete an item."
parameters:
- name: "id"
in: "path"
required: false
schema:
type: string
example: id=27
responses:
"200":
description: "OK"
"400":
description: "Bad Request"
components:
schemas:
CollectionItem:
type: "object"
properties:
id:
type: "integer"
format: "int64"
description: "The unique ID of the item."
example: 27
title:
type: "string"
description: "The title of the item."
example: "The Fellowship of the Ring"
author:
type: "array"
description: "The creator(s) behind the media."
example: [ "J.R.R. Tolkien" ]
publisher:
type: "string"
description: "The company who published the media."
example: ""
publishingDate:
type: "string"
description: "The date the book was published in yyyy-MM-DD format. 9999-12-31 for unknown."
example: ""
locNumber:
type: "string"
description: "The Library of Congress categorization number."
example: ""
deweyDecimalNumber:
type: "string"
description: "The Dewey Decimal Number."
example: ""
isbn:
type: "integer"
format: "int64"
description: "The ISBN number assigned to the book. Also known as the barcode."
example: ""
sortTitle:
type: "string"
description: "The tite of the book with any articles moved to the end for sorting purposes."
example: "Fellowship of the Ring, The"
format:
type: "string"
description: "The format the media is in. E.g. book, magazine, dvd, 8-track, etc."
example: "book"
language:
type: "string"
description: "The two letter abbreviation of the language the media is in."
example: ""
pageCount:
type: "integer"
format: "int32"
description: "The number of pages the media has. 0 if not a book/magazine."
categories:
type: "array"
description: "A list of the subjects/categories the media falls into."
example: [ "Fantasy", "High Fantasy", "Linguistics" ]
description:
type: "string"
description: "A short synopsis or blurb about the media."
example: ""
priceInCents:
type: "integer"
format: "int32"
description: "The cost of the item, in cents. E.g. $20 is 2000."
example: ""
coverImageUri:
type: "string"
description: "The path to find the cover image for the item."
example: ""
isCheckedIn:
type: "boolean"
description: "A flag to show if the item is checked in (true) or checked out (false)."
example: true
isArchived:
type: "boolean"
description: "A flag to show if the item is 'deleted' (true) or still in circulation (false)."
example: false
isLost:
type: "boolean"
description: "A flag to show if the item is lost (true) or not yet lost (false)."
example: false
lostDate:
type: "string"
description: "A string representation of the date the item is updated to lost. yyyy-MM-DD. 9999-12-31 for not lost."
example: "9999-12-31"
NewCollectionItem:
type: "object"
properties:
title:
type: "string"
description: "The title of the item."
example: "The Fellowship of the Ring"
author:
type: "array"
description: "The creator(s) behind the media."
example: [ "J.R.R. Tolkien" ]
publisher:
type: "string"
description: "The company who published the media."
example: ""
publishingDate:
type: "string"
description: "The date the book was published in yyyy-MM-DD format. 9999-12-31 for unknown."
example: ""
locNumber:
type: "string"
description: "The Library of Congress categorization number."
example: ""
deweyDecimalNumber:
type: "string"
description: "The Dewey Decimal Number."
example: ""
isbn:
type: "integer"
format: "int64"
description: "The ISBN number assigned to the book. Also known as the barcode."
example: ""
sortTitle:
type: "string"
description: "The tite of the book with any articles moved to the end for sorting purposes."
example: "Fellowship of the Ring, The"
format:
type: "string"
description: "The format the media is in. E.g. book, magazine, dvd, 8-track, etc."
example: "book"
language:
type: "string"
description: "The two letter abbreviation of the language the media is in."
example: ""
pageCount:
type: "integer"
format: "int32"
description: "The number of pages the media has. 0 if not a book/magazine."
categories:
type: "array"
description: "A list of the subjects/categories the media falls into."
example: [ "Fantasy", "High Fantasy", "Linguistics" ]
description:
type: "string"
description: "A short synopsis or blurb about the media."
example: ""
priceInCents:
type: "integer"
format: "int32"
description: "The cost of the item, in cents. E.g. $20 is 2000."
example: ""
coverImageUri:
type: "string"
description: "The path to find the cover image for the item."
example: ""
isCheckedIn:
type: "boolean"
description: "A flag to show if the item is checked in (true) or checked out (false)."
example: true
isArchived:
type: "boolean"
description: "A flag to show if the item is 'deleted' (true) or still in circulation (false)."
example: false
isLost:
type: "boolean"
description: "A flag to show if the item is lost (true) or not yet lost (false)."
example: false
lostDate:
type: "string"
description: "A string representation of the date the item is updated to lost. yyyy-MM-DD. 9999-12-31 for not lost."
example: "9999-12-31"