This commit is contained in:
Rutra
2026-05-13 11:50:22 +02:00
commit 2068229f89
128 changed files with 9215 additions and 0 deletions

View File

@@ -0,0 +1,24 @@
import User from '#models/user';
import { loginValidator } from '#validators/user';
import UserTransformer from '#transformers/user_transformer';
export default class AccessTokensController {
async store({ request, serialize }) {
const { email, password } = await request.validateUsing(loginValidator);
const user = await User.verifyCredentials(email, password);
const token = await User.accessTokens.create(user);
return serialize({
user: UserTransformer.transform(user),
token: token.value.release(),
});
}
async destroy({ auth }) {
const user = auth.getUserOrFail();
if (user.currentAccessToken) {
await User.accessTokens.delete(user, user.currentAccessToken.identifier);
}
return {
message: 'Logged out successfully',
};
}
}
//# sourceMappingURL=access_tokens_controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"access_tokens_controller.js","sourceRoot":"","sources":["../../../app/controllers/access_tokens_controller.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,cAAc,CAAA;AAC/B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,eAAe,MAAM,gCAAgC,CAAA;AAE5D,MAAM,CAAC,OAAO,OAAO,sBAAsB;IACzC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAe;QAC7C,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,cAAc,CAAC,CAAA;QAEvE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAA;QAC1D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAElD,OAAO,SAAS,CAAC;YACf,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC;YACrC,KAAK,EAAE,KAAK,CAAC,KAAM,CAAC,OAAO,EAAE;SAC9B,CAAC,CAAA;IACJ,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,IAAI,EAAe;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,EAAE,CAAA;QACjC,IAAI,IAAI,CAAC,kBAAkB,EAAE,CAAC;YAC5B,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAA;QAC1E,CAAC;QAED,OAAO;YACL,OAAO,EAAE,yBAAyB;SACnC,CAAA;IACH,CAAC;CACF"}

View File

@@ -0,0 +1,67 @@
import BrandColor from '#models/brand_color';
import BrandFont from '#models/brand_font';
import Fanart from '#models/fanart';
import Game from '#models/game';
import Profile from '#models/profile';
import SocialLink from '#models/social_link';
import Tag from '#models/tag';
export default class BackupsController {
async export({ response }) {
const [profile, tags, games, socialLinks, fanarts, brandColors, brandFonts] = await Promise.all([
Profile.first(),
Tag.all(),
Game.query().orderBy('sort_order', 'asc'),
SocialLink.all(),
Fanart.query().orderBy('sort_order', 'asc'),
BrandColor.all(),
BrandFont.all(),
]);
return response.json({
version: 1,
exportedAt: new Date().toISOString(),
profile: profile?.serialize(),
tags: tags.map((t) => ({ name: t.name })),
games: games.map((g) => ({ name: g.name, icon: g.icon, type: g.type, sortOrder: g.sortOrder })),
socialLinks: socialLinks.map((s) => ({ platform: s.platform, url: s.url, username: s.username, icon: s.icon, color: s.color })),
fanarts: fanarts.map((f) => ({ title: f.title, author: f.author, imageUrl: f.imageUrl, sortOrder: f.sortOrder })),
brand: {
colors: brandColors.map((c) => ({ name: c.name, hex: c.hex })),
fonts: brandFonts.map((f) => ({ name: f.name })),
},
});
}
async restore({ request, response }) {
const backup = request.body();
if (backup.profile) {
await Profile.truncate();
const { name, avatarUrl, title, description, aboutText } = backup.profile;
await Profile.create({ name, avatarUrl, title, description, aboutText });
}
if (Array.isArray(backup.tags)) {
await Tag.truncate();
await Tag.createMany(backup.tags.map((t) => ({ name: t.name })));
}
if (Array.isArray(backup.games)) {
await Game.truncate();
await Game.createMany(backup.games.map((g) => ({ name: g.name, icon: g.icon, type: g.type, sortOrder: g.sortOrder })));
}
if (Array.isArray(backup.socialLinks)) {
await SocialLink.truncate();
await SocialLink.createMany(backup.socialLinks.map((s) => ({ platform: s.platform, url: s.url, username: s.username, icon: s.icon, color: s.color })));
}
if (Array.isArray(backup.fanarts)) {
await Fanart.truncate();
await Fanart.createMany(backup.fanarts.map((f) => ({ title: f.title, author: f.author, imageUrl: f.imageUrl, sortOrder: f.sortOrder })));
}
if (backup.brand?.colors) {
await BrandColor.truncate();
await BrandColor.createMany(backup.brand.colors.map((c) => ({ name: c.name, hex: c.hex })));
}
if (backup.brand?.fonts) {
await BrandFont.truncate();
await BrandFont.createMany(backup.brand.fonts.map((f) => ({ name: f.name })));
}
return response.json({ success: true, restoredAt: new Date().toISOString() });
}
}
//# sourceMappingURL=backups_controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"backups_controller.js","sourceRoot":"","sources":["../../../app/controllers/backups_controller.ts"],"names":[],"mappings":"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"}

View File

@@ -0,0 +1,22 @@
import BrandColor from '#models/brand_color';
import BrandFont from '#models/brand_font';
export default class BrandsController {
async show({}) {
const colors = await BrandColor.all();
const fonts = await BrandFont.all();
return { colors, fonts };
}
async update({ request }) {
const { colors, fonts } = request.only(['colors', 'fonts']);
if (colors) {
await BrandColor.truncate();
await BrandColor.createMany(colors);
}
if (fonts) {
await BrandFont.truncate();
await BrandFont.createMany(fonts);
}
return this.show({ request });
}
}
//# sourceMappingURL=brands_controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"brands_controller.js","sourceRoot":"","sources":["../../../app/controllers/brands_controller.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,qBAAqB,CAAA;AAC5C,OAAO,SAAS,MAAM,oBAAoB,CAAA;AAG1C,MAAM,CAAC,OAAO,OAAO,gBAAgB;IACnC,KAAK,CAAC,IAAI,CAAC,EAAe;QACxB,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,GAAG,EAAE,CAAA;QACrC,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,GAAG,EAAE,CAAA;QACnC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAe;QACnC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAA;QAE3D,IAAI,MAAM,EAAE,CAAC;YACX,MAAM,UAAU,CAAC,QAAQ,EAAE,CAAA;YAC3B,MAAM,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,CAAA;QACrC,CAAC;QACD,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,SAAS,CAAC,QAAQ,EAAE,CAAA;YAC1B,MAAM,SAAS,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;QACnC,CAAC;QAED,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,OAAO,EAAS,CAAC,CAAA;IACtC,CAAC;CACF"}

View File

@@ -0,0 +1,23 @@
import Fanart from '#models/fanart';
export default class FanartsController {
async index({}) {
return Fanart.query().orderBy('sort_order', 'asc');
}
async store({ request }) {
const data = request.only(['title', 'author', 'imageUrl', 'sortOrder']);
return Fanart.create(data);
}
async update({ params, request }) {
const fanart = await Fanart.findOrFail(params.id);
const data = request.only(['title', 'author', 'imageUrl', 'sortOrder']);
fanart.merge(data);
await fanart.save();
return fanart;
}
async destroy({ params, response }) {
const fanart = await Fanart.findOrFail(params.id);
await fanart.delete();
return response.noContent();
}
}
//# sourceMappingURL=fanarts_controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"fanarts_controller.js","sourceRoot":"","sources":["../../../app/controllers/fanarts_controller.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,gBAAgB,CAAA;AAGnC,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,KAAK,CAAC,KAAK,CAAC,EAAe;QACzB,OAAO,MAAM,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;IACpD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAe;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;QACvE,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC5B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAe;QAC3C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACjD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,CAAC,CAAC,CAAA;QACvE,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAClB,MAAM,MAAM,CAAC,IAAI,EAAE,CAAA;QACnB,OAAO,MAAM,CAAA;IACf,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAe;QAC7C,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACjD,MAAM,MAAM,CAAC,MAAM,EAAE,CAAA;QACrB,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAA;IAC7B,CAAC;CACF"}

View File

@@ -0,0 +1,23 @@
import Game from '#models/game';
export default class GamesController {
async index({}) {
return Game.query().orderBy('sort_order', 'asc');
}
async store({ request }) {
const data = request.only(['name', 'icon', 'type', 'sortOrder']);
return Game.create(data);
}
async update({ params, request }) {
const game = await Game.findOrFail(params.id);
const data = request.only(['name', 'icon', 'type', 'sortOrder']);
game.merge(data);
await game.save();
return game;
}
async destroy({ params, response }) {
const game = await Game.findOrFail(params.id);
await game.delete();
return response.noContent();
}
}
//# sourceMappingURL=games_controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"games_controller.js","sourceRoot":"","sources":["../../../app/controllers/games_controller.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,cAAc,CAAA;AAG/B,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,KAAK,CAAC,KAAK,CAAC,EAAe;QACzB,OAAO,IAAI,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,YAAY,EAAE,KAAK,CAAC,CAAA;IAClD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAe;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;QAChE,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAC1B,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAe;QAC3C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC7C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAA;QAChE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAe;QAC7C,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QAC7C,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QACnB,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAA;IAC7B,CAAC;CACF"}

View File

@@ -0,0 +1,15 @@
import User from '#models/user';
import { signupValidator } from '#validators/user';
import UserTransformer from '#transformers/user_transformer';
export default class NewAccountController {
async store({ request, serialize }) {
const { fullName, email, password } = await request.validateUsing(signupValidator);
const user = await User.create({ fullName, email, password });
const token = await User.accessTokens.create(user);
return serialize({
user: UserTransformer.transform(user),
token: token.value.release(),
});
}
}
//# sourceMappingURL=new_account_controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"new_account_controller.js","sourceRoot":"","sources":["../../../app/controllers/new_account_controller.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,cAAc,CAAA;AAC/B,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,OAAO,eAAe,MAAM,gCAAgC,CAAA;AAE5D,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAE,SAAS,EAAe;QAC7C,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,OAAO,CAAC,aAAa,CAAC,eAAe,CAAC,CAAA;QAElF,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC7D,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAElD,OAAO,SAAS,CAAC;YACf,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC;YACrC,KAAK,EAAE,KAAK,CAAC,KAAM,CAAC,OAAO,EAAE;SAC9B,CAAC,CAAA;IACJ,CAAC;CACF"}

View File

@@ -0,0 +1,7 @@
import UserTransformer from '#transformers/user_transformer';
export default class ProfileController {
async show({ auth, serialize }) {
return serialize(UserTransformer.transform(auth.getUserOrFail()));
}
}
//# sourceMappingURL=profile_controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"profile_controller.js","sourceRoot":"","sources":["../../../app/controllers/profile_controller.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,gCAAgC,CAAA;AAG5D,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAe;QACzC,OAAO,SAAS,CAAC,eAAe,CAAC,SAAS,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;IACnE,CAAC;CACF"}

View File

@@ -0,0 +1,23 @@
import SocialLink from '#models/social_link';
export default class SocialLinksController {
async index({}) {
return SocialLink.all();
}
async store({ request }) {
const data = request.only(['platform', 'url', 'username', 'icon', 'color']);
return SocialLink.create(data);
}
async update({ params, request }) {
const link = await SocialLink.findOrFail(params.id);
const data = request.only(['platform', 'url', 'username', 'icon', 'color']);
link.merge(data);
await link.save();
return link;
}
async destroy({ params, response }) {
const link = await SocialLink.findOrFail(params.id);
await link.delete();
return response.noContent();
}
}
//# sourceMappingURL=social_links_controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"social_links_controller.js","sourceRoot":"","sources":["../../../app/controllers/social_links_controller.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,qBAAqB,CAAA;AAG5C,MAAM,CAAC,OAAO,OAAO,qBAAqB;IACxC,KAAK,CAAC,KAAK,CAAC,EAAe;QACzB,OAAO,UAAU,CAAC,GAAG,EAAE,CAAA;IACzB,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,EAAE,OAAO,EAAe;QAClC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QAC3E,OAAO,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;IAChC,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,OAAO,EAAe;QAC3C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAAA;QAC3E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QAChB,MAAM,IAAI,CAAC,IAAI,EAAE,CAAA;QACjB,OAAO,IAAI,CAAA;IACb,CAAC;IAED,KAAK,CAAC,OAAO,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAe;QAC7C,MAAM,IAAI,GAAG,MAAM,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA;QACnD,MAAM,IAAI,CAAC,MAAM,EAAE,CAAA;QACnB,OAAO,QAAQ,CAAC,SAAS,EAAE,CAAA;IAC7B,CAAC;CACF"}

View File

@@ -0,0 +1,18 @@
import Profile from '#models/profile';
import Tag from '#models/tag';
export default class VtubersController {
async show({}) {
const profile = await Profile.firstOrFail();
const tags = await Tag.all();
return { ...profile.serialize(), tags: tags.map((t) => t.name) };
}
async update({ request }) {
const profile = await Profile.firstOrFail();
const data = request.only(['name', 'avatarUrl', 'backgroundImageUrl', 'title', 'description', 'aboutText']);
profile.merge(data);
await profile.save();
const tags = await Tag.all();
return { ...profile.serialize(), tags: tags.map((t) => t.name) };
}
}
//# sourceMappingURL=vtubers_controller.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"vtubers_controller.js","sourceRoot":"","sources":["../../../app/controllers/vtubers_controller.ts"],"names":[],"mappings":"AAAA,OAAO,OAAO,MAAM,iBAAiB,CAAA;AACrC,OAAO,GAAG,MAAM,aAAa,CAAA;AAG7B,MAAM,CAAC,OAAO,OAAO,iBAAiB;IACpC,KAAK,CAAC,IAAI,CAAC,EAAe;QACxB,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAA;QAC3C,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;QAC5B,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAClE,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,EAAE,OAAO,EAAe;QACnC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,WAAW,EAAE,CAAA;QAC3C,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,CAAC,CAAC,CAAA;QAC3G,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnB,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;QACpB,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,GAAG,EAAE,CAAA;QAC5B,OAAO,EAAE,GAAG,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAA;IAClE,CAAC;CACF"}

12
app/exceptions/handler.js Normal file
View File

@@ -0,0 +1,12 @@
import app from '@adonisjs/core/services/app';
import { ExceptionHandler } from '@adonisjs/core/http';
export default class HttpExceptionHandler extends ExceptionHandler {
debug = !app.inProduction;
async handle(error, ctx) {
return super.handle(error, ctx);
}
async report(error, ctx) {
return super.report(error, ctx);
}
}
//# sourceMappingURL=handler.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../app/exceptions/handler.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,6BAA6B,CAAA;AAC7C,OAAO,EAAoB,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAExE,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,gBAAgB;IAKtD,KAAK,GAAG,CAAC,GAAG,CAAC,YAAY,CAAA;IAMnC,KAAK,CAAC,MAAM,CAAC,KAAc,EAAE,GAAgB;QAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACjC,CAAC;IAQD,KAAK,CAAC,MAAM,CAAC,KAAc,EAAE,GAAgB;QAC3C,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;IACjC,CAAC;CACF"}

View File

@@ -0,0 +1,7 @@
export default class AuthMiddleware {
async handle(ctx, next, options = {}) {
await ctx.auth.authenticateUsing(options.guards);
return next();
}
}
//# sourceMappingURL=auth_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"auth_middleware.js","sourceRoot":"","sources":["../../../app/middleware/auth_middleware.ts"],"names":[],"mappings":"AAQA,MAAM,CAAC,OAAO,OAAO,cAAc;IACjC,KAAK,CAAC,MAAM,CACV,GAAgB,EAChB,IAAY,EACZ,UAEI,EAAE;QAEN,MAAM,GAAG,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;QAChD,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

View File

@@ -0,0 +1,10 @@
import { Logger } from '@adonisjs/core/logger';
import { HttpContext } from '@adonisjs/core/http';
export default class ContainerBindingsMiddleware {
handle(ctx, next) {
ctx.containerResolver.bindValue(HttpContext, ctx);
ctx.containerResolver.bindValue(Logger, ctx.logger);
return next();
}
}
//# sourceMappingURL=container_bindings_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"container_bindings_middleware.js","sourceRoot":"","sources":["../../../app/middleware/container_bindings_middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AAUjD,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAC9C,MAAM,CAAC,GAAgB,EAAE,IAAY;QACnC,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,WAAW,EAAE,GAAG,CAAC,CAAA;QACjD,GAAG,CAAC,iBAAiB,CAAC,SAAS,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;QAEnD,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

View File

@@ -0,0 +1,7 @@
export default class ForceJsonResponseMiddleware {
handle(ctx, next) {
ctx.request.request.headers.accept = 'application/json';
return next();
}
}
//# sourceMappingURL=force_json_response_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"force_json_response_middleware.js","sourceRoot":"","sources":["../../../app/middleware/force_json_response_middleware.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,2BAA2B;IAC9C,MAAM,CAAC,GAAgB,EAAE,IAAY;QACnC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,kBAAkB,CAAA;QACvD,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

View File

@@ -0,0 +1,7 @@
export default class SilentAuthMiddleware {
async handle(ctx, next) {
await ctx.auth.check();
return next();
}
}
//# sourceMappingURL=silent_auth_middleware.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"silent_auth_middleware.js","sourceRoot":"","sources":["../../../app/middleware/silent_auth_middleware.ts"],"names":[],"mappings":"AASA,MAAM,CAAC,OAAO,OAAO,oBAAoB;IACvC,KAAK,CAAC,MAAM,CAAC,GAAgB,EAAE,IAAY;QACzC,MAAM,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE,CAAA;QAEtB,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;CACF"}

View File

@@ -0,0 +1,4 @@
import { BrandColorSchema } from '#database/schema';
export default class BrandColor extends BrandColorSchema {
}
//# sourceMappingURL=brand_color.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"brand_color.js","sourceRoot":"","sources":["../../../app/models/brand_color.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,gBAAgB;CACvD"}

4
app/models/brand_font.js Normal file
View File

@@ -0,0 +1,4 @@
import { BrandFontSchema } from '#database/schema';
export default class BrandFont extends BrandFontSchema {
}
//# sourceMappingURL=brand_font.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"brand_font.js","sourceRoot":"","sources":["../../../app/models/brand_font.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAA;AAElD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,eAAe;CACrD"}

4
app/models/fanart.js Normal file
View File

@@ -0,0 +1,4 @@
import { FanartSchema } from '#database/schema';
export default class Fanart extends FanartSchema {
}
//# sourceMappingURL=fanart.js.map

1
app/models/fanart.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"fanart.js","sourceRoot":"","sources":["../../../app/models/fanart.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAA;AAE/C,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,YAAY;CAC/C"}

4
app/models/game.js Normal file
View File

@@ -0,0 +1,4 @@
import { GameSchema } from '#database/schema';
export default class Game extends GameSchema {
}
//# sourceMappingURL=game.js.map

1
app/models/game.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"game.js","sourceRoot":"","sources":["../../../app/models/game.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAE7C,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,UAAU;CAC3C"}

4
app/models/profile.js Normal file
View File

@@ -0,0 +1,4 @@
import { ProfileSchema } from '#database/schema';
export default class Profile extends ProfileSchema {
}
//# sourceMappingURL=profile.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"profile.js","sourceRoot":"","sources":["../../../app/models/profile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAEhD,MAAM,CAAC,OAAO,OAAO,OAAQ,SAAQ,aAAa;CACjD"}

View File

@@ -0,0 +1,4 @@
import { SocialLinkSchema } from '#database/schema';
export default class SocialLink extends SocialLinkSchema {
}
//# sourceMappingURL=social_link.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"social_link.js","sourceRoot":"","sources":["../../../app/models/social_link.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAA;AAEnD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,gBAAgB;CACvD"}

4
app/models/tag.js Normal file
View File

@@ -0,0 +1,4 @@
import { TagSchema } from '#database/schema';
export default class Tag extends TagSchema {
}
//# sourceMappingURL=tag.js.map

1
app/models/tag.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"tag.js","sourceRoot":"","sources":["../../../app/models/tag.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAE5C,MAAM,CAAC,OAAO,OAAO,GAAI,SAAQ,SAAS;CACzC"}

16
app/models/user.js Normal file
View File

@@ -0,0 +1,16 @@
import { UserSchema } from '#database/schema';
import hash from '@adonisjs/core/services/hash';
import { compose } from '@adonisjs/core/helpers';
import { withAuthFinder } from '@adonisjs/auth/mixins/lucid';
import { DbAccessTokensProvider } from '@adonisjs/auth/access_tokens';
export default class User extends compose(UserSchema, withAuthFinder(hash)) {
static accessTokens = DbAccessTokensProvider.forModel(User);
get initials() {
const [first, last] = this.fullName ? this.fullName.split(' ') : this.email.split('@');
if (first && last) {
return `${first.charAt(0)}${last.charAt(0)}`.toUpperCase();
}
return `${first.slice(0, 2)}`.toUpperCase();
}
}
//# sourceMappingURL=user.js.map

1
app/models/user.js.map Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../app/models/user.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAA;AAC7C,OAAO,IAAI,MAAM,8BAA8B,CAAA;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAA;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAA;AAC5D,OAAO,EAAoB,sBAAsB,EAAE,MAAM,8BAA8B,CAAA;AAEvF,MAAM,CAAC,OAAO,OAAO,IAAK,SAAQ,OAAO,CAAC,UAAU,EAAE,cAAc,CAAC,IAAI,CAAC,CAAC;IACzE,MAAM,CAAC,YAAY,GAAG,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAA;IAG3D,IAAI,QAAQ;QACV,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;QACtF,IAAI,KAAK,IAAI,IAAI,EAAE,CAAC;YAClB,OAAO,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAA;QAC5D,CAAC;QACD,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,WAAW,EAAE,CAAA;IAC7C,CAAC"}

View File

@@ -0,0 +1,14 @@
import { BaseTransformer } from '@adonisjs/core/transformers';
export default class UserTransformer extends BaseTransformer {
toObject() {
return this.pick(this.resource, [
'id',
'fullName',
'email',
'createdAt',
'updatedAt',
'initials',
]);
}
}
//# sourceMappingURL=user_transformer.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"user_transformer.js","sourceRoot":"","sources":["../../../app/transformers/user_transformer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,6BAA6B,CAAA;AAE7D,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,eAAqB;IAChE,QAAQ;QACN,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE;YAC9B,IAAI;YACJ,UAAU;YACV,OAAO;YACP,WAAW;YACX,WAAW;YACX,UAAU;SACX,CAAC,CAAA;IACJ,CAAC;CACF"}

14
app/validators/user.js Normal file
View File

@@ -0,0 +1,14 @@
import vine from '@vinejs/vine';
const email = () => vine.string().email().maxLength(254);
const password = () => vine.string().minLength(8).maxLength(32);
export const signupValidator = vine.create({
fullName: vine.string().nullable(),
email: email().unique({ table: 'users', column: 'email' }),
password: password(),
passwordConfirmation: password().sameAs('password'),
});
export const loginValidator = vine.create({
email: email(),
password: vine.string(),
});
//# sourceMappingURL=user.js.map

View File

@@ -0,0 +1 @@
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../app/validators/user.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,cAAc,CAAA;AAK/B,MAAM,KAAK,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC,SAAS,CAAC,GAAG,CAAC,CAAA;AACxD,MAAM,QAAQ,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,CAAC,CAAA;AAK/D,MAAM,CAAC,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC;IACzC,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,KAAK,EAAE,KAAK,EAAE,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC1D,QAAQ,EAAE,QAAQ,EAAE;IACpB,oBAAoB,EAAE,QAAQ,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC;CACpD,CAAC,CAAA;AAMF,MAAM,CAAC,MAAM,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC;IACxC,KAAK,EAAE,KAAK,EAAE;IACd,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE;CACxB,CAAC,CAAA"}