From b85af70635b82eeb6e70f0a255341765be8a597c Mon Sep 17 00:00:00 2001 From: Dwayne Harris Date: Thu, 5 Dec 2019 01:02:04 -0500 Subject: [PATCH] WIP --- .vscode/settings.json | 3 + package-lock.json | 213 ++++++++++++++++++++++++++++-- package.json | 1 + src/awards.ts | 22 --- src/lib/authentication.ts | 4 +- src/lib/collections.ts | 1 + src/lib/crypto.ts | 10 +- src/lib/database.ts | 2 +- src/lib/utils.ts | 2 +- src/plugins/api/apps.ts | 63 ++++++++- src/plugins/api/authentication.ts | 9 +- src/plugins/api/groups.ts | 69 +++++++++- src/plugins/api/media.ts | 14 ++ src/plugins/api/posts.ts | 29 ++-- src/plugins/api/users.ts | 39 +++++- src/schemas.ts | 46 +++---- src/server.ts | 30 +++++ src/types/collections.ts | 48 ------- src/types/index.ts | 9 -- 19 files changed, 467 insertions(+), 147 deletions(-) create mode 100644 .vscode/settings.json delete mode 100644 src/awards.ts diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..00ad71f --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "typescript.tsdk": "node_modules\\typescript\\lib" +} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 0134b32..558f6aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -175,6 +175,11 @@ "@types/node": "*" } }, + "@types/swagger-schema-official": { + "version": "2.0.20", + "resolved": "https://registry.npmjs.org/@types/swagger-schema-official/-/swagger-schema-official-2.0.20.tgz", + "integrity": "sha512-GHdvwZQg7i+6AUMnP+tqYJJbt59SuYu8k9dzX8E6TJ5QFXKW9FxfdfqT5g+VcyuEua+/YaRzumqJ6wcQMuSP5Q==" + }, "@types/tunnel": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/@types/tunnel/-/tunnel-0.0.1.tgz", @@ -264,6 +269,14 @@ "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" }, + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + }, "args": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/args/-/args-5.0.1.tgz", @@ -352,8 +365,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -445,7 +457,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -662,8 +673,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "configstore": { "version": "3.1.2", @@ -817,6 +827,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, "diagnostics": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/diagnostics/-/diagnostics-1.1.1.tgz", @@ -865,6 +880,11 @@ "safe-buffer": "^5.0.1" } }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, "enabled": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/enabled/-/enabled-1.0.2.tgz", @@ -873,6 +893,11 @@ "env-variable": "0.0.x" } }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, "end-of-stream": { "version": "1.4.4", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", @@ -926,12 +951,27 @@ "is-symbol": "^1.0.2" } }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", "dev": true }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, "events": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/events/-/events-3.0.0.tgz", @@ -1193,6 +1233,28 @@ } } }, + "fastify-static": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/fastify-static/-/fastify-static-2.5.1.tgz", + "integrity": "sha512-aPpyT+ADHtZ/i35Ly6Cyyz9DA6HRwgJr0bJEMucmTxaXBIO5LaEsIOTzTP+U0/UBScer/mL4x2eSHp9l6WTnkw==", + "requires": { + "fastify-plugin": "^1.6.0", + "glob": "^7.1.4", + "readable-stream": "^3.4.0", + "send": "^0.16.0" + } + }, + "fastify-swagger": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/fastify-swagger/-/fastify-swagger-2.5.0.tgz", + "integrity": "sha512-WF3LpwwZunLtxzs1Dukwg7P4uBR9f2cwXL/JKD5D4O9Leq/S2QUfMNZg0eHxe4bJy1aUS9tt7IAHvY3ybgbApg==", + "requires": { + "@types/swagger-schema-official": "^2.0.20", + "fastify-plugin": "^1.6.0", + "fastify-static": "^2.5.1", + "js-yaml": "^3.12.1" + } + }, "fastq": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.6.0.tgz", @@ -1284,6 +1346,16 @@ "resolved": "https://registry.npmjs.org/frameguard/-/frameguard-3.1.0.tgz", "integrity": "sha512-TxgSKM+7LTA6sidjOiSZK9wxY0ffMPY3Wta//MqwmX0nZuEHc8QrkV8Fh3ZhMJeiH+Uyh/tcaarImRy8u77O7g==" }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, "fsevents": { "version": "1.2.9", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.9.tgz", @@ -1851,6 +1923,19 @@ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", "dev": true }, + "glob": { + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", + "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, "glob-parent": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", @@ -2005,6 +2090,29 @@ "depd": "2.0.0" } }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + } + } + }, "ienoopen": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/ienoopen/-/ienoopen-1.1.0.tgz", @@ -2028,6 +2136,15 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -2295,6 +2412,15 @@ "integrity": "sha1-o/Iiqarp+Wb10nx5ZRDigJF2Qhc=", "dev": true }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + }, "json-parse-better-errors": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", @@ -2525,6 +2651,11 @@ "reusify": "^1.0.2" } }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, "mime-db": { "version": "1.40.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", @@ -2542,7 +2673,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -2786,6 +2916,14 @@ "isobject": "^3.0.1" } }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2850,8 +2988,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -3018,6 +3155,11 @@ "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-3.0.3.tgz", "integrity": "sha512-dy1yjycmn9blucmJLXOfZDx1ikZJUi6E8bBZLnhPG5gBrVhHXx2xVyqqgKBubVNEXmx51dBACMHpoMQK/N/AXQ==" }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, "rc": { "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", @@ -3234,6 +3376,46 @@ "resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz", "integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg==" }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "set-value": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz", @@ -3257,6 +3439,11 @@ } } }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", @@ -3494,6 +3681,11 @@ "readable-stream": "^3.0.0" } }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, "stack-trace": { "version": "0.0.10", "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", @@ -3520,6 +3712,11 @@ } } }, + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", diff --git a/package.json b/package.json index 5cfefef..69f31b1 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "fastify": "^2.10.0", "fastify-cors": "^2.2.0", "fastify-helmet": "^3.0.2", + "fastify-swagger": "^2.5.0", "jsonwebtoken": "^8.5.1", "lodash": "^4.17.15", "moment": "^2.24.0", diff --git a/src/awards.ts b/src/awards.ts deleted file mode 100644 index 94a5328..0000000 --- a/src/awards.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { AwardDefinition } from './types' - -const awards: AwardDefinition[] = [ - { - id: 'like', - name: 'Like', - imageUrl: '', - text: '', - cost: 0, - reward: 0, - }, - { - id: 'bronze', - name: 'Bronze', - imageUrl: '', - text: 'Bronze Award!', - cost: 2000, - reward: 200, - }, -] - -export default awards diff --git a/src/lib/authentication.ts b/src/lib/authentication.ts index 7ac94a3..d70a60b 100644 --- a/src/lib/authentication.ts +++ b/src/lib/authentication.ts @@ -2,9 +2,7 @@ import { JWT } from '../lib/crypto' import { createRefreshToken as createToken } from '../lib/utils' import { UserToken, UserItemType } from '../types/collections' -export async function createAccessToken(userId: string): Promise { - return await JWT.sign({ sub: userId }, { expiresIn: process.env.TOKEN_EXPIRATION }) -} +export const createAccessToken = async (userId: string) => await JWT.sign({ sub: userId }, { expiresIn: process.env.TOKEN_EXPIRATION }) export function createRefreshToken(userId: string, userAgent: string, ip: string): UserToken { return { diff --git a/src/lib/collections.ts b/src/lib/collections.ts index 43c4a3a..3ec9dba 100644 --- a/src/lib/collections.ts +++ b/src/lib/collections.ts @@ -27,6 +27,7 @@ export async function getUser(client: CosmosClient, id: string): Promise { const users = await queryItems({ container: containerFor(client, 'Users'), diff --git a/src/lib/crypto.ts b/src/lib/crypto.ts index 3dc822b..b4814f6 100644 --- a/src/lib/crypto.ts +++ b/src/lib/crypto.ts @@ -2,14 +2,8 @@ import { hash, compare } from 'bcryptjs' import { randomBytes } from 'crypto' import jwt, { SignOptions, VerifyOptions } from 'jsonwebtoken' -export async function hashPassword(password: string): Promise { - return await hash(password, 8) -} - -export async function comparePassword(password: string, hash: string): Promise { - return await compare(password, hash) -} - +export const hashPassword = async (password: string) => await hash(password, 8) +export const comparePassword = async (password: string, hash: string) => await compare(password, hash) export const generateString = (length: number) => randomBytes(Math.max(Math.round(length / 2), 5)).toString('hex') export namespace JWT { diff --git a/src/lib/database.ts b/src/lib/database.ts index 9c1968b..bae0b6c 100644 --- a/src/lib/database.ts +++ b/src/lib/database.ts @@ -40,7 +40,7 @@ interface GetItemOptions { export async function getItem(options: GetItemOptions): Promise { const { container, id, partitionKey, logger } = options - const { resource, requestCharge } = await container.item(id, partitionKey || id).read() + const { resource, requestCharge } = await container.item(id, partitionKey ?? id).read() if (logger) logger.trace('Get: %d', requestCharge) return resource diff --git a/src/lib/utils.ts b/src/lib/utils.ts index 9523742..aa95985 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -10,9 +10,9 @@ export function trimContent(content?: string, length: number = 128): string { export const createId = () => v4().replace(/-/g, '') export const createPostId = () => 'p' + createId() -export const createInvitationCode = () => generateString(8) export const createInstallationId = () => 'i' + createId() export const createRefreshToken = () => 'r' + createId() +export const createInvitationCode = () => generateString(8) export async function wait(ms: number = 5000): Promise { return new Promise(resolve => { diff --git a/src/plugins/api/apps.ts b/src/plugins/api/apps.ts index 864c34e..4cc85f9 100644 --- a/src/plugins/api/apps.ts +++ b/src/plugins/api/apps.ts @@ -21,7 +21,7 @@ import { createInstallationId } from '../../lib/utils' import { APP_PARTITION_KEY, MAX_NAME_LENGTH, INSTALLATION_PARTITION_KEY } from '../../constants' -import { App, User, Installation, UserSettings, InstallationSettings } from '../../types/collections' +import { App, User, Installation, InstallationSettings } from '../../types/collections' import { PluginOptions } from '../../types' function availabilityRoute(server: FastifyInstance) { @@ -31,6 +31,8 @@ function availabilityRoute(server: FastifyInstance({ ...app, version, - name: name || app.name, + name: name ?? app.name, imageUrl, coverImageUrl, iconImageUrl, @@ -447,6 +465,8 @@ function getRoute(server: FastifyInstance) { const options: RouteShorthandOptions = { schema: { + description: 'Get authenticated user Installations.', + tags: ['app'], response: { 200: { + description: 'Successful response.', type: 'object', properties: { installations: { @@ -722,6 +757,8 @@ function activateRoute(server: FastifyInstance) { const options: RouteShorthandOptions = { schema: { + description: 'Get authenticated User.', + tags: ['authentication'], response: { 200: selfSchema, 400: errorSchema, diff --git a/src/plugins/api/groups.ts b/src/plugins/api/groups.ts index f0ddf6e..4084238 100644 --- a/src/plugins/api/groups.ts +++ b/src/plugins/api/groups.ts @@ -45,6 +45,8 @@ function availabilityRoute(server: FastifyInstance) { const options: RouteShorthandOptions = { schema: { + description: 'Get a shared access signature.', + tags: ['media'], response: { 200: { type: 'object', @@ -53,6 +55,8 @@ function addRoute(server: FastifyInstance) { const options: RouteShorthandOptions = { schema: { + description: 'Create a Post.', + tags: ['post'], body: postBodySchema, response: { - 200: { + 201: { + description: 'Post created.', type: 'object', properties: { id: { type: 'string' }, @@ -239,6 +238,7 @@ function createPostRoute(server: FastifyInstance { + if (err) throw err + server.swagger() +}) + const start = async () => { try { await server.listen(parseInt(process.env.PORT!)) diff --git a/src/types/collections.ts b/src/types/collections.ts index 3117c4e..c8b5331 100644 --- a/src/types/collections.ts +++ b/src/types/collections.ts @@ -38,11 +38,6 @@ export enum UserPrivacyType { Private = 'private', } -export enum UserTransactionType { - Purchase = 'purchase', - Award = 'award', -} - export enum GroupStatus { Pending = 'pending', Paid = 'paid', @@ -79,11 +74,6 @@ export enum BlockType { Group = 'group', } -export enum PostItemType { - Post = 'post', - Award = 'award', -} - export interface GroupListing { id: string pk: typeof GROUP_LISTING_PARTITION_KEY @@ -92,9 +82,7 @@ export interface GroupListing { registration: GroupRegistrationType members: number posts: number - awards: number points: number - latestAwards: PostAwardPartial[] created: number } @@ -190,7 +178,6 @@ export interface User { passwordHash: string settings: UserSettings installations: string[] - awards: number // Total Awards points: number balance: number // Currency (Flex) posts: number @@ -250,17 +237,6 @@ export interface UserBlock { created: number } -export interface UserTransaction { - id: string - pk: string - t: UserItemType.Transaction - transactionType: UserTransactionType - fromUserId: string - toUserId: string - amount: number - created: number -} - export interface UserTimelinePost { id: string pk: string // userId @@ -287,7 +263,6 @@ export interface PostData { export interface Post { id: string pk: string // postId - t: PostItemType.Post userId: string appId: string root: string @@ -299,29 +274,6 @@ export interface Post { data?: PostData visible: boolean replies: number - awards: number - latestAwards: PostAwardPartial[] - created: number -} - -export interface PostAward { - id: string - pk: string // postId - t: PostItemType.Award - userId: string - imageUrl: string - text: string - userText: string - cost: number - reward: number - created: number -} - -export interface PostAwardPartial { - userId: string - imageUrl: string - text: string - userText: string created: number } diff --git a/src/types/index.ts b/src/types/index.ts index 74c766b..71c152c 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -16,13 +16,4 @@ export interface DatabaseItem { id: string } -export interface AwardDefinition { - id: string - name: string - imageUrl: string - text: string - cost: number - reward: number -} - export interface PluginOptions {}