mirror of
https://github.com/spacebarchat/server.git
synced 2024-11-22 10:22:39 +01:00
applications
This commit is contained in:
parent
a567ca3f51
commit
3335f16ad1
45115
assets/schemas.json
45115
assets/schemas.json
File diff suppressed because it is too large
Load Diff
@ -16,78 +16,114 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { Request, Response, Router } from "express";
|
||||
import { route } from "@spacebar/api";
|
||||
import {
|
||||
Application,
|
||||
generateToken,
|
||||
User,
|
||||
BotModifySchema,
|
||||
handleFile,
|
||||
DiscordApiErrors,
|
||||
User,
|
||||
generateToken,
|
||||
handleFile,
|
||||
} from "@spacebar/util";
|
||||
import { Request, Response, Router } from "express";
|
||||
import { HTTPError } from "lambert-server";
|
||||
import { verifyToken } from "node-2fa";
|
||||
|
||||
const router: Router = Router();
|
||||
|
||||
router.post("/", route({}), async (req: Request, res: Response) => {
|
||||
const app = await Application.findOneOrFail({
|
||||
where: { id: req.params.id },
|
||||
relations: ["owner"],
|
||||
});
|
||||
router.post(
|
||||
"/",
|
||||
route({
|
||||
responses: {
|
||||
200: {
|
||||
body: "TokenResponse",
|
||||
},
|
||||
400: {
|
||||
body: "APIErrorResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
const app = await Application.findOneOrFail({
|
||||
where: { id: req.params.id },
|
||||
relations: ["owner"],
|
||||
});
|
||||
|
||||
if (app.owner.id != req.user_id)
|
||||
throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION;
|
||||
if (app.owner.id != req.user_id)
|
||||
throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION;
|
||||
|
||||
const user = await User.register({
|
||||
username: app.name,
|
||||
password: undefined,
|
||||
id: app.id,
|
||||
req,
|
||||
});
|
||||
const user = await User.register({
|
||||
username: app.name,
|
||||
password: undefined,
|
||||
id: app.id,
|
||||
req,
|
||||
});
|
||||
|
||||
user.id = app.id;
|
||||
user.premium_since = new Date();
|
||||
user.bot = true;
|
||||
user.id = app.id;
|
||||
user.premium_since = new Date();
|
||||
user.bot = true;
|
||||
|
||||
await user.save();
|
||||
await user.save();
|
||||
|
||||
// flags is NaN here?
|
||||
app.assign({ bot: user, flags: app.flags || 0 });
|
||||
// flags is NaN here?
|
||||
app.assign({ bot: user, flags: app.flags || 0 });
|
||||
|
||||
await app.save();
|
||||
await app.save();
|
||||
|
||||
res.send({
|
||||
token: await generateToken(user.id),
|
||||
}).status(204);
|
||||
});
|
||||
res.send({
|
||||
token: await generateToken(user.id),
|
||||
}).status(204);
|
||||
},
|
||||
);
|
||||
|
||||
router.post("/reset", route({}), async (req: Request, res: Response) => {
|
||||
const bot = await User.findOneOrFail({ where: { id: req.params.id } });
|
||||
const owner = await User.findOneOrFail({ where: { id: req.user_id } });
|
||||
router.post(
|
||||
"/reset",
|
||||
route({
|
||||
responses: {
|
||||
200: {
|
||||
body: "TokenResponse",
|
||||
},
|
||||
400: {
|
||||
body: "APIErrorResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
const bot = await User.findOneOrFail({ where: { id: req.params.id } });
|
||||
const owner = await User.findOneOrFail({ where: { id: req.user_id } });
|
||||
|
||||
if (owner.id != req.user_id)
|
||||
throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION;
|
||||
if (owner.id != req.user_id)
|
||||
throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION;
|
||||
|
||||
if (
|
||||
owner.totp_secret &&
|
||||
(!req.body.code || verifyToken(owner.totp_secret, req.body.code))
|
||||
)
|
||||
throw new HTTPError(req.t("auth:login.INVALID_TOTP_CODE"), 60008);
|
||||
if (
|
||||
owner.totp_secret &&
|
||||
(!req.body.code || verifyToken(owner.totp_secret, req.body.code))
|
||||
)
|
||||
throw new HTTPError(req.t("auth:login.INVALID_TOTP_CODE"), 60008);
|
||||
|
||||
bot.data = { hash: undefined, valid_tokens_since: new Date() };
|
||||
bot.data = { hash: undefined, valid_tokens_since: new Date() };
|
||||
|
||||
await bot.save();
|
||||
await bot.save();
|
||||
|
||||
const token = await generateToken(bot.id);
|
||||
const token = await generateToken(bot.id);
|
||||
|
||||
res.json({ token }).status(200);
|
||||
});
|
||||
res.json({ token }).status(200);
|
||||
},
|
||||
);
|
||||
|
||||
router.patch(
|
||||
"/",
|
||||
route({ body: "BotModifySchema" }),
|
||||
route({
|
||||
body: "BotModifySchema",
|
||||
responses: {
|
||||
200: {
|
||||
body: "Application",
|
||||
},
|
||||
400: {
|
||||
body: "APIErrorResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
const body = req.body as BotModifySchema;
|
||||
if (!body.avatar?.trim()) delete body.avatar;
|
||||
|
@ -16,15 +16,25 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { Router, Response, Request } from "express";
|
||||
import { route } from "@spacebar/api";
|
||||
import { Request, Response, Router } from "express";
|
||||
|
||||
const router = Router();
|
||||
|
||||
router.get("/", route({}), (req: Request, res: Response) => {
|
||||
// TODO:
|
||||
//const { exclude_consumed } = req.query;
|
||||
res.status(200).send([]);
|
||||
});
|
||||
router.get(
|
||||
"/",
|
||||
route({
|
||||
responses: {
|
||||
200: {
|
||||
body: "ApplicationEntitlementsResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
(req: Request, res: Response) => {
|
||||
// TODO:
|
||||
//const { exclude_consumed } = req.query;
|
||||
res.status(200).send([]);
|
||||
},
|
||||
);
|
||||
|
||||
export default router;
|
||||
|
@ -16,32 +16,55 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { Request, Response, Router } from "express";
|
||||
import { route } from "@spacebar/api";
|
||||
import {
|
||||
Application,
|
||||
DiscordApiErrors,
|
||||
ApplicationModifySchema,
|
||||
DiscordApiErrors,
|
||||
} from "@spacebar/util";
|
||||
import { verifyToken } from "node-2fa";
|
||||
import { Request, Response, Router } from "express";
|
||||
import { HTTPError } from "lambert-server";
|
||||
import { verifyToken } from "node-2fa";
|
||||
|
||||
const router: Router = Router();
|
||||
|
||||
router.get("/", route({}), async (req: Request, res: Response) => {
|
||||
const app = await Application.findOneOrFail({
|
||||
where: { id: req.params.id },
|
||||
relations: ["owner", "bot"],
|
||||
});
|
||||
if (app.owner.id != req.user_id)
|
||||
throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION;
|
||||
router.get(
|
||||
"/",
|
||||
route({
|
||||
responses: {
|
||||
200: {
|
||||
body: "Application",
|
||||
},
|
||||
400: {
|
||||
body: "APIErrorResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
const app = await Application.findOneOrFail({
|
||||
where: { id: req.params.id },
|
||||
relations: ["owner", "bot"],
|
||||
});
|
||||
if (app.owner.id != req.user_id)
|
||||
throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION;
|
||||
|
||||
return res.json(app);
|
||||
});
|
||||
return res.json(app);
|
||||
},
|
||||
);
|
||||
|
||||
router.patch(
|
||||
"/",
|
||||
route({ body: "ApplicationModifySchema" }),
|
||||
route({
|
||||
body: "ApplicationModifySchema",
|
||||
responses: {
|
||||
200: {
|
||||
body: "Application",
|
||||
},
|
||||
400: {
|
||||
body: "APIErrorResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
const body = req.body as ApplicationModifySchema;
|
||||
|
||||
@ -73,23 +96,35 @@ router.patch(
|
||||
},
|
||||
);
|
||||
|
||||
router.post("/delete", route({}), async (req: Request, res: Response) => {
|
||||
const app = await Application.findOneOrFail({
|
||||
where: { id: req.params.id },
|
||||
relations: ["bot", "owner"],
|
||||
});
|
||||
if (app.owner.id != req.user_id)
|
||||
throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION;
|
||||
router.post(
|
||||
"/delete",
|
||||
route({
|
||||
responses: {
|
||||
200: {},
|
||||
400: {
|
||||
body: "APIErrorResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
const app = await Application.findOneOrFail({
|
||||
where: { id: req.params.id },
|
||||
relations: ["bot", "owner"],
|
||||
});
|
||||
if (app.owner.id != req.user_id)
|
||||
throw DiscordApiErrors.ACTION_NOT_AUTHORIZED_ON_APPLICATION;
|
||||
|
||||
if (
|
||||
app.owner.totp_secret &&
|
||||
(!req.body.code || verifyToken(app.owner.totp_secret, req.body.code))
|
||||
)
|
||||
throw new HTTPError(req.t("auth:login.INVALID_TOTP_CODE"), 60008);
|
||||
if (
|
||||
app.owner.totp_secret &&
|
||||
(!req.body.code ||
|
||||
verifyToken(app.owner.totp_secret, req.body.code))
|
||||
)
|
||||
throw new HTTPError(req.t("auth:login.INVALID_TOTP_CODE"), 60008);
|
||||
|
||||
await Application.delete({ id: app.id });
|
||||
await Application.delete({ id: app.id });
|
||||
|
||||
res.send().status(200);
|
||||
});
|
||||
res.send().status(200);
|
||||
},
|
||||
);
|
||||
|
||||
export default router;
|
||||
|
@ -16,13 +16,23 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { Request, Response, Router } from "express";
|
||||
import { route } from "@spacebar/api";
|
||||
import { Request, Response, Router } from "express";
|
||||
|
||||
const router: Router = Router();
|
||||
|
||||
router.get("/", route({}), async (req: Request, res: Response) => {
|
||||
res.json([]).status(200);
|
||||
});
|
||||
router.get(
|
||||
"/",
|
||||
route({
|
||||
responses: {
|
||||
200: {
|
||||
body: "ApplicationSkusResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
res.json([]).status(200);
|
||||
},
|
||||
);
|
||||
|
||||
export default router;
|
||||
|
@ -16,14 +16,24 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { Request, Response, Router } from "express";
|
||||
import { route } from "@spacebar/api";
|
||||
import { Request, Response, Router } from "express";
|
||||
|
||||
const router: Router = Router();
|
||||
|
||||
router.get("/", route({}), async (req: Request, res: Response) => {
|
||||
//TODO
|
||||
res.send([]).status(200);
|
||||
});
|
||||
router.get(
|
||||
"/",
|
||||
route({
|
||||
responses: {
|
||||
200: {
|
||||
body: "ApplicationDetectableResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
//TODO
|
||||
res.send([]).status(200);
|
||||
},
|
||||
);
|
||||
|
||||
export default router;
|
||||
|
@ -16,28 +16,45 @@
|
||||
along with this program. If not, see <https://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
import { Request, Response, Router } from "express";
|
||||
import { route } from "@spacebar/api";
|
||||
import {
|
||||
Application,
|
||||
ApplicationCreateSchema,
|
||||
trimSpecial,
|
||||
User,
|
||||
trimSpecial,
|
||||
} from "@spacebar/util";
|
||||
import { Request, Response, Router } from "express";
|
||||
|
||||
const router: Router = Router();
|
||||
|
||||
router.get("/", route({}), async (req: Request, res: Response) => {
|
||||
const results = await Application.find({
|
||||
where: { owner: { id: req.user_id } },
|
||||
relations: ["owner", "bot"],
|
||||
});
|
||||
res.json(results).status(200);
|
||||
});
|
||||
router.get(
|
||||
"/",
|
||||
route({
|
||||
responses: {
|
||||
200: {
|
||||
body: "ApplicationsResponse",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
const results = await Application.find({
|
||||
where: { owner: { id: req.user_id } },
|
||||
relations: ["owner", "bot"],
|
||||
});
|
||||
res.json(results).status(200);
|
||||
},
|
||||
);
|
||||
|
||||
router.post(
|
||||
"/",
|
||||
route({ body: "ApplicationCreateSchema" }),
|
||||
route({
|
||||
body: "ApplicationCreateSchema",
|
||||
responses: {
|
||||
200: {
|
||||
body: "Application",
|
||||
},
|
||||
},
|
||||
}),
|
||||
async (req: Request, res: Response) => {
|
||||
const body = req.body as ApplicationCreateSchema;
|
||||
const user = await User.findOneOrFail({ where: { id: req.user_id } });
|
||||
|
@ -55,7 +55,8 @@ export interface RouteOptions {
|
||||
body?: `${string}Schema`; // typescript interface name
|
||||
responses?: {
|
||||
[status: number]: {
|
||||
body?: `${string}Response`;
|
||||
// body?: `${string}Response`;
|
||||
body?: string;
|
||||
};
|
||||
};
|
||||
test?: {
|
||||
|
@ -0,0 +1 @@
|
||||
export type ApplicationDetectableResponse = unknown[];
|
@ -0,0 +1 @@
|
||||
export type ApplicationEntitlementsResponse = unknown[];
|
1
src/util/schemas/responses/ApplicationSkusResponse.ts
Normal file
1
src/util/schemas/responses/ApplicationSkusResponse.ts
Normal file
@ -0,0 +1 @@
|
||||
export type ApplicationSkusResponse = unknown[];
|
3
src/util/schemas/responses/ApplicationsResponse.ts
Normal file
3
src/util/schemas/responses/ApplicationsResponse.ts
Normal file
@ -0,0 +1,3 @@
|
||||
import { Application } from "../../entities";
|
||||
|
||||
export type ApplicationsResponse = Application[];
|
@ -1,5 +1,9 @@
|
||||
export * from "./APIErrorOrCaptchaResponse";
|
||||
export * from "./APIErrorResponse";
|
||||
export * from "./ApplicationDetectableResponse";
|
||||
export * from "./ApplicationEntitlementsResponse";
|
||||
export * from "./ApplicationSkusResponse";
|
||||
export * from "./ApplicationsResponse";
|
||||
export * from "./BackupCodesChallengeResponse";
|
||||
export * from "./CaptchaRequiredResponse";
|
||||
export * from "./GenerateRegistrationTokensResponse";
|
||||
|
Loading…
Reference in New Issue
Block a user