Adding in public endpoint definitions.
This commit is contained in:
parent
5f94ed7fe0
commit
6a09fdc3e5
|
@ -3,7 +3,6 @@ myapps/
|
||||||
.env
|
.env
|
||||||
builder/*
|
builder/*
|
||||||
client/*
|
client/*
|
||||||
public/
|
|
||||||
db/dev.db/
|
db/dev.db/
|
||||||
dist
|
dist
|
||||||
coverage/
|
coverage/
|
||||||
|
|
|
@ -18,12 +18,54 @@ const options = {
|
||||||
description: "Budibase Cloud API",
|
description: "Budibase Cloud API",
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
url: "http://localhost:10000/api/public/v1",
|
url: "{protocol}://{hostname}:10000/api/public/v1",
|
||||||
description: "Budibase self hosted API",
|
description: "Budibase self hosted API",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
|
components: {
|
||||||
|
examples: {
|
||||||
|
row: {
|
||||||
|
value: {
|
||||||
|
_id: "ro_ta_5b1649e42a5b41dea4ef7742a36a7a70_e6dc7e38cf1343b2b56760265201cda4",
|
||||||
|
type: "row",
|
||||||
|
tableId: "ta_5b1649e42a5b41dea4ef7742a36a7a70",
|
||||||
|
name: "Mike",
|
||||||
|
age: 30,
|
||||||
|
relationship: [
|
||||||
|
{
|
||||||
|
primaryDisplay: "Joe",
|
||||||
|
_id: "ro_ta_...",
|
||||||
},
|
},
|
||||||
format: "json",
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
table: {
|
||||||
|
value: {
|
||||||
|
_id: "ta_5b1649e42a5b41dea4ef7742a36a7a70",
|
||||||
|
name: "People",
|
||||||
|
schema: {
|
||||||
|
name: {
|
||||||
|
type: "string",
|
||||||
|
name: "name",
|
||||||
|
},
|
||||||
|
age: {
|
||||||
|
type: "number",
|
||||||
|
name: "age",
|
||||||
|
},
|
||||||
|
relationship: {
|
||||||
|
type: "link",
|
||||||
|
name: "relationship",
|
||||||
|
tableId: "ta_...",
|
||||||
|
fieldName: "relatedColumn",
|
||||||
|
relationshipType: "many-to-many",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
format: ".json",
|
||||||
apis: [join(__dirname, "..", "src", "api", "routes", "public", "*.js")],
|
apis: [join(__dirname, "..", "src", "api", "routes", "public", "*.js")],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -47,8 +89,7 @@ function writeFile(output, { isJson } = {}) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const outputJSON = swaggerJsdoc(options)
|
const outputJSON = swaggerJsdoc(options)
|
||||||
options.format = "yaml"
|
options.format = ".yaml"
|
||||||
const outputYAML = swaggerJsdoc(options)
|
const outputYAML = swaggerJsdoc(options)
|
||||||
console.log(outputYAML)
|
writeFile(outputJSON, { isJson: true })
|
||||||
writeFile(outputJSON)
|
|
||||||
writeFile(outputYAML)
|
writeFile(outputYAML)
|
||||||
|
|
|
@ -7,14 +7,56 @@
|
||||||
},
|
},
|
||||||
"servers": [
|
"servers": [
|
||||||
{
|
{
|
||||||
"url": "https://budibase.app/api/public/v1",
|
"url": "http://budibase.app/api/public/v1",
|
||||||
"description": "Budibase Cloud API"
|
"description": "Budibase Cloud API"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"url": "http://localhost:10000/api/public/v1",
|
"url": "{protocol}://{hostname}:10000/api/public/v1",
|
||||||
"description": "Budibase self hosted API"
|
"description": "Budibase self hosted API"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"components": {
|
||||||
|
"examples": {
|
||||||
|
"row": {
|
||||||
|
"value": {
|
||||||
|
"_id": "ro_ta_5b1649e42a5b41dea4ef7742a36a7a70_e6dc7e38cf1343b2b56760265201cda4",
|
||||||
|
"type": "row",
|
||||||
|
"tableId": "ta_5b1649e42a5b41dea4ef7742a36a7a70",
|
||||||
|
"name": "Mike",
|
||||||
|
"age": 30,
|
||||||
|
"relationship": [
|
||||||
|
{
|
||||||
|
"primaryDisplay": "Joe",
|
||||||
|
"_id": "ro_ta_..."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"table": {
|
||||||
|
"value": {
|
||||||
|
"_id": "ta_5b1649e42a5b41dea4ef7742a36a7a70",
|
||||||
|
"name": "People",
|
||||||
|
"schema": {
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"name": "name"
|
||||||
|
},
|
||||||
|
"age": {
|
||||||
|
"type": "number",
|
||||||
|
"name": "age"
|
||||||
|
},
|
||||||
|
"relationship": {
|
||||||
|
"type": "link",
|
||||||
|
"name": "relationship",
|
||||||
|
"tableId": "ta_...",
|
||||||
|
"fieldName": "relatedColumn",
|
||||||
|
"relationshipType": "many-to-many"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
"paths": {
|
"paths": {
|
||||||
"/row/{tableId}/search": {
|
"/row/{tableId}/search": {
|
||||||
"post": {
|
"post": {
|
||||||
|
@ -35,6 +77,9 @@
|
||||||
"content": {
|
"content": {
|
||||||
"application/json": {
|
"application/json": {
|
||||||
"schema": {
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"query": {
|
||||||
"type": "object",
|
"type": "object",
|
||||||
"properties": {
|
"properties": {
|
||||||
"string": {
|
"string": {
|
||||||
|
@ -78,18 +123,98 @@
|
||||||
"description": "Searches for rows which have a column value that is any of the specified values. The format of this must be columnName -> [value1, value2]."
|
"description": "Searches for rows which have a column value that is any of the specified values. The format of this must be columnName -> [value1, value2]."
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"paginate": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "Enables pagination, by default this is disabled."
|
||||||
|
},
|
||||||
|
"bookmark": {
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "If retrieving another page, the bookmark from the previous request must be supplied."
|
||||||
|
},
|
||||||
|
"limit": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "The maximum number of rows to return, useful when paginating, for internal tables this will be limited to 1000, for SQL tables it will be 5000."
|
||||||
|
},
|
||||||
|
"sort": {
|
||||||
|
"type": "object",
|
||||||
|
"description": "A set of parameters describing the sort behaviour of the search.",
|
||||||
|
"properties": {
|
||||||
|
"order": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"ascending",
|
||||||
|
"descending"
|
||||||
|
],
|
||||||
|
"description": "The order of the sort, by default this is ascending."
|
||||||
|
},
|
||||||
|
"column": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The name of the column by which the rows will be sorted."
|
||||||
|
},
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"string",
|
||||||
|
"number"
|
||||||
|
],
|
||||||
|
"description": "Defines whether the column should be treated as a string or as numbers when sorting."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"responses": {
|
"responses": {
|
||||||
"200": {
|
"200": {
|
||||||
"description": "Returns the rows."
|
"description": "The response will contain an array of rows that match the search parameters.",
|
||||||
|
"content": {
|
||||||
|
"application/json": {
|
||||||
|
"schema": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"rows": {
|
||||||
|
"description": "An array of rows, these will each contain an _id field which can be used to update or delete them.",
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"example": {
|
||||||
|
"$ref": "#/components/examples/row"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"bookmark": {
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "integer"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "If pagination in use, this should be provided"
|
||||||
|
},
|
||||||
|
"hasNextPage": {
|
||||||
|
"description": "If pagination in use, this will determine if there is another page to fetch.",
|
||||||
|
"type": "boolean"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"components": {},
|
|
||||||
"tags": []
|
"tags": []
|
||||||
}
|
}
|
|
@ -0,0 +1,160 @@
|
||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
title: Budibase API
|
||||||
|
description: The public API for Budibase apps and its services.
|
||||||
|
version: 1.0.0
|
||||||
|
servers:
|
||||||
|
- url: http://budibase.app/api/public/v1
|
||||||
|
description: Budibase Cloud API
|
||||||
|
- url: "{protocol}://{hostname}:10000/api/public/v1"
|
||||||
|
description: Budibase self hosted API
|
||||||
|
components:
|
||||||
|
examples:
|
||||||
|
row:
|
||||||
|
value:
|
||||||
|
_id: ro_ta_5b1649e42a5b41dea4ef7742a36a7a70_e6dc7e38cf1343b2b56760265201cda4
|
||||||
|
type: row
|
||||||
|
tableId: ta_5b1649e42a5b41dea4ef7742a36a7a70
|
||||||
|
name: Mike
|
||||||
|
age: 30
|
||||||
|
relationship:
|
||||||
|
- primaryDisplay: Joe
|
||||||
|
_id: ro_ta_...
|
||||||
|
table:
|
||||||
|
value:
|
||||||
|
_id: ta_5b1649e42a5b41dea4ef7742a36a7a70
|
||||||
|
name: People
|
||||||
|
schema:
|
||||||
|
name:
|
||||||
|
type: string
|
||||||
|
name: name
|
||||||
|
age:
|
||||||
|
type: number
|
||||||
|
name: age
|
||||||
|
relationship:
|
||||||
|
type: link
|
||||||
|
name: relationship
|
||||||
|
tableId: ta_...
|
||||||
|
fieldName: relatedColumn
|
||||||
|
relationshipType: many-to-many
|
||||||
|
paths:
|
||||||
|
"/row/{tableId}/search":
|
||||||
|
post:
|
||||||
|
summary: Allows searching for rows within a table.
|
||||||
|
parameters:
|
||||||
|
- in: path
|
||||||
|
name: tableId
|
||||||
|
required: true
|
||||||
|
description: The ID of the table which contains the rows which are being
|
||||||
|
searched for.
|
||||||
|
schema:
|
||||||
|
type: string
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
query:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
string:
|
||||||
|
type: object
|
||||||
|
example:
|
||||||
|
columnName1: value
|
||||||
|
columnName2: value
|
||||||
|
description: A map of field name to the string to search for, this will look for
|
||||||
|
rows that have a value starting with the string value.
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: The value to search for in the column.
|
||||||
|
fuzzy:
|
||||||
|
type: object
|
||||||
|
description: A fuzzy search, only supported by internal tables.
|
||||||
|
range:
|
||||||
|
type: object
|
||||||
|
description: Searches within a range, the format of this must be columnName ->
|
||||||
|
[low, high].
|
||||||
|
equal:
|
||||||
|
type: object
|
||||||
|
description: Searches for rows that have a column value that is exactly the
|
||||||
|
value set.
|
||||||
|
notEqual:
|
||||||
|
type: object
|
||||||
|
description: Searches for any row which does not contain the specified column
|
||||||
|
value.
|
||||||
|
empty:
|
||||||
|
type: object
|
||||||
|
description: Searches for rows which do not contain the specified column. The
|
||||||
|
object should simply contain keys of the column names,
|
||||||
|
these can map to any value.
|
||||||
|
notEmpty:
|
||||||
|
type: object
|
||||||
|
description: Searches for rows which have the specified column.
|
||||||
|
oneOf:
|
||||||
|
type: object
|
||||||
|
description: Searches for rows which have a column value that is any of the
|
||||||
|
specified values. The format of this must be columnName
|
||||||
|
-> [value1, value2].
|
||||||
|
paginate:
|
||||||
|
type: boolean
|
||||||
|
description: Enables pagination, by default this is disabled.
|
||||||
|
bookmark:
|
||||||
|
oneOf:
|
||||||
|
- type: string
|
||||||
|
- type: integer
|
||||||
|
description: If retrieving another page, the bookmark from the previous request
|
||||||
|
must be supplied.
|
||||||
|
limit:
|
||||||
|
type: integer
|
||||||
|
description: The maximum number of rows to return, useful when paginating, for
|
||||||
|
internal tables this will be limited to 1000, for SQL tables
|
||||||
|
it will be 5000.
|
||||||
|
sort:
|
||||||
|
type: object
|
||||||
|
description: A set of parameters describing the sort behaviour of the search.
|
||||||
|
properties:
|
||||||
|
order:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- ascending
|
||||||
|
- descending
|
||||||
|
description: The order of the sort, by default this is ascending.
|
||||||
|
column:
|
||||||
|
type: string
|
||||||
|
description: The name of the column by which the rows will be sorted.
|
||||||
|
type:
|
||||||
|
type: string
|
||||||
|
enum:
|
||||||
|
- string
|
||||||
|
- number
|
||||||
|
description: Defines whether the column should be treated as a string or as
|
||||||
|
numbers when sorting.
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: The response will contain an array of rows that match the search
|
||||||
|
parameters.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
rows:
|
||||||
|
description: An array of rows, these will each contain an _id field which can be
|
||||||
|
used to update or delete them.
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
type: object
|
||||||
|
example:
|
||||||
|
$ref: "#/components/examples/row"
|
||||||
|
bookmark:
|
||||||
|
oneOf:
|
||||||
|
- type: string
|
||||||
|
- type: integer
|
||||||
|
description: If pagination in use, this should be provided
|
||||||
|
hasNextPage:
|
||||||
|
description: If pagination in use, this will determine if there is another page
|
||||||
|
to fetch.
|
||||||
|
type: boolean
|
||||||
|
tags: []
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Contains pass through functions for all of the public API, make sure
|
||||||
|
* parameters are in correct format for the main controllers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
exports.search = () => {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.create = () => {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.singleRead = () => {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.update = () => {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
exports.delete = () => {
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
const Router = require("@koa/router")
|
||||||
|
|
||||||
|
const router = Router()
|
||||||
|
|
||||||
|
module.exports = router
|
|
@ -0,0 +1,25 @@
|
||||||
|
const appRoute = require("./applications")
|
||||||
|
const queryRoute = require("./queries")
|
||||||
|
const tableRoute = require("./tables")
|
||||||
|
const rowRoute = require("./rows")
|
||||||
|
const userRoute = require("./users")
|
||||||
|
const Router = require("@koa/router")
|
||||||
|
|
||||||
|
const PREFIX = "/api/public/v1"
|
||||||
|
const ROUTES = [
|
||||||
|
appRoute,
|
||||||
|
queryRoute,
|
||||||
|
tableRoute,
|
||||||
|
rowRoute,
|
||||||
|
userRoute
|
||||||
|
]
|
||||||
|
|
||||||
|
const router = new Router({
|
||||||
|
prefix: PREFIX,
|
||||||
|
})
|
||||||
|
for (let route of ROUTES) {
|
||||||
|
router.use(route.routes())
|
||||||
|
router.use(route.allowedMethods())
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = router
|
|
@ -0,0 +1,5 @@
|
||||||
|
const Router = require("@koa/router")
|
||||||
|
|
||||||
|
const router = Router()
|
||||||
|
|
||||||
|
module.exports = router
|
|
@ -0,0 +1,130 @@
|
||||||
|
const Router = require("@koa/router")
|
||||||
|
const controller = require("../../controllers/public")
|
||||||
|
|
||||||
|
const router = Router()
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @openapi
|
||||||
|
* /row/{tableId}/search:
|
||||||
|
* post:
|
||||||
|
* summary: Allows searching for rows within a table.
|
||||||
|
* parameters:
|
||||||
|
* - in: path
|
||||||
|
* name: tableId
|
||||||
|
* required: true
|
||||||
|
* description: The ID of the table which contains the rows
|
||||||
|
* which are being searched for.
|
||||||
|
* schema:
|
||||||
|
* type: string
|
||||||
|
* requestBody:
|
||||||
|
* required: true
|
||||||
|
* content:
|
||||||
|
* application/json:
|
||||||
|
* schema:
|
||||||
|
* type: object
|
||||||
|
* properties:
|
||||||
|
* query:
|
||||||
|
* type: object
|
||||||
|
* properties:
|
||||||
|
* string:
|
||||||
|
* type: object
|
||||||
|
* example:
|
||||||
|
* columnName1: value
|
||||||
|
* columnName2: value
|
||||||
|
* description: A map of field name to the string to search for,
|
||||||
|
* this will look for rows that have a value starting with the
|
||||||
|
* string value.
|
||||||
|
* additionalProperties:
|
||||||
|
* type: string
|
||||||
|
* description: The value to search for in the column.
|
||||||
|
* fuzzy:
|
||||||
|
* type: object
|
||||||
|
* description: A fuzzy search, only supported by internal tables.
|
||||||
|
* range:
|
||||||
|
* type: object
|
||||||
|
* description: Searches within a range, the format of this must be
|
||||||
|
* columnName -> [low, high].
|
||||||
|
* equal:
|
||||||
|
* type: object
|
||||||
|
* description: Searches for rows that have a column value that is
|
||||||
|
* exactly the value set.
|
||||||
|
* notEqual:
|
||||||
|
* type: object
|
||||||
|
* description: Searches for any row which does not contain the specified
|
||||||
|
* column value.
|
||||||
|
* empty:
|
||||||
|
* type: object
|
||||||
|
* description: Searches for rows which do not contain the specified column.
|
||||||
|
* The object should simply contain keys of the column names, these
|
||||||
|
* can map to any value.
|
||||||
|
* notEmpty:
|
||||||
|
* type: object
|
||||||
|
* description: Searches for rows which have the specified column.
|
||||||
|
* oneOf:
|
||||||
|
* type: object
|
||||||
|
* description: Searches for rows which have a column value that is any
|
||||||
|
* of the specified values. The format of this must be columnName -> [value1, value2].
|
||||||
|
* paginate:
|
||||||
|
* type: boolean
|
||||||
|
* description: Enables pagination, by default this is disabled.
|
||||||
|
* bookmark:
|
||||||
|
* oneOf:
|
||||||
|
* - type: string
|
||||||
|
* - type: integer
|
||||||
|
* description: If retrieving another page, the bookmark from the previous request must be supplied.
|
||||||
|
* limit:
|
||||||
|
* type: integer
|
||||||
|
* description: The maximum number of rows to return, useful when paginating, for internal tables this
|
||||||
|
* will be limited to 1000, for SQL tables it will be 5000.
|
||||||
|
* sort:
|
||||||
|
* type: object
|
||||||
|
* description: A set of parameters describing the sort behaviour of the search.
|
||||||
|
* properties:
|
||||||
|
* order:
|
||||||
|
* type: string
|
||||||
|
* enum: [ascending, descending]
|
||||||
|
* description: The order of the sort, by default this is ascending.
|
||||||
|
* column:
|
||||||
|
* type: string
|
||||||
|
* description: The name of the column by which the rows will be sorted.
|
||||||
|
* type:
|
||||||
|
* type: string
|
||||||
|
* enum: [string, number]
|
||||||
|
* description: Defines whether the column should be treated as a string
|
||||||
|
* or as numbers when sorting.
|
||||||
|
* responses:
|
||||||
|
* 200:
|
||||||
|
* description: The response will contain an array of rows that match the search parameters.
|
||||||
|
* content:
|
||||||
|
* application/json:
|
||||||
|
* schema:
|
||||||
|
* type: object
|
||||||
|
* properties:
|
||||||
|
* rows:
|
||||||
|
* description: An array of rows, these will each contain an _id field which can be used
|
||||||
|
* to update or delete them.
|
||||||
|
* type: array
|
||||||
|
* items:
|
||||||
|
* type: object
|
||||||
|
* example:
|
||||||
|
* $ref: '#/components/examples/row'
|
||||||
|
* bookmark:
|
||||||
|
* oneOf:
|
||||||
|
* - type: string
|
||||||
|
* - type: integer
|
||||||
|
* description: If pagination in use, this should be provided
|
||||||
|
* hasNextPage:
|
||||||
|
* description: If pagination in use, this will determine if there is another page to fetch.
|
||||||
|
* type: boolean
|
||||||
|
*/
|
||||||
|
router.post("/tables/:tableId/rows/search", controller.search)
|
||||||
|
|
||||||
|
router.post("/tables/:tableId/rows", controller.create)
|
||||||
|
|
||||||
|
router.put("/tables/:tableId/rows/:rowId", controller.update)
|
||||||
|
|
||||||
|
router.delete("/tables/:tableId/rows/:rowId", controller.delete)
|
||||||
|
|
||||||
|
router.get("/tables/:tableId/rows/:rowId", controller.singleRead)
|
||||||
|
|
||||||
|
module.exports = router
|
|
@ -0,0 +1,5 @@
|
||||||
|
const Router = require("@koa/router")
|
||||||
|
|
||||||
|
const router = Router()
|
||||||
|
|
||||||
|
module.exports = router
|
|
@ -0,0 +1,5 @@
|
||||||
|
const Router = require("@koa/router")
|
||||||
|
|
||||||
|
const router = Router()
|
||||||
|
|
||||||
|
module.exports = router
|
Loading…
Reference in New Issue