Skip to content
Merged

Fix #49

Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 34 additions & 0 deletions migrations/202605061441.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { Pool } from "mariadb/*";
import { MigrationParams } from "umzug";

/**
* Migration pour insérer le paramètre "maintenance" à "true"
* seulement s'il n'existe pas déjà dans la table "settings".
*/

export async function up({ context: pool }: MigrationParams<Pool>) {
const conn = await pool.getConnection();
try {
await conn.query(
`INSERT INTO settings (
\`key\`,
\`value\`
)
SELECT 'maintenance', 'true'
WHERE NOT EXISTS (
SELECT 1 FROM settings WHERE \`key\` = 'maintenance'
);`,
);
} finally {
conn.release();
}
}

export async function down({ context: pool }: MigrationParams<Pool>) {
const conn = await pool.getConnection();
try {
// No-op: la migration ne doit pas supprimer une ligne potentiellement préexistante.
} finally {
conn.release();
}
}
10 changes: 10 additions & 0 deletions src/graphql/graphqlSchema.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,12 @@ import {
mediaTypes,
} from "./schemas/mediaSchema";
import mediaResolver from "./resolvers/mediaResolver";
import {
settingsMutations,
settingsQueries,
settingsTypes,
} from "./schemas/settingsSchema";
import settingsResolver from "./resolvers/settingsResolver";

/**
* Construit le schéma GraphQL en combinant les types, requêtes et mutations de tous les modules.
Expand All @@ -70,6 +76,7 @@ export function getSchema() {
${coworkerInputs}
${projectTypes}
${projectInputs}
${settingsTypes}
type Query {
${accountQueries}
${categoryQueries}
Expand All @@ -78,6 +85,7 @@ export function getSchema() {
${coworkerQueries}
${projectQueries}
${mediaQueries}
${settingsQueries}
}
type Mutation {
${authMutations}
Expand All @@ -88,6 +96,7 @@ export function getSchema() {
${coworkerMutations}
${projectMutations}
${mediaMutations}
${settingsMutations}
}
`);
}
Expand All @@ -106,5 +115,6 @@ export function getRoot() {
...coworkerResolver,
...projectResolver,
...mediaResolver,
...settingsResolver,
};
}
34 changes: 34 additions & 0 deletions src/graphql/resolvers/settingsResolver.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { SettingsRepository } from "../../repositories/SettingsRepository";
import { checkAuth } from "../../utils/validationUtils";
import jwt from "jsonwebtoken";

function parseBooleanSetting(value: string | null): boolean {
if (value === null) return false;
const normalized = value.trim().toLowerCase();
return normalized === "true" || normalized === "1";
}

const settingsResolver = {
// Résolveur pour la requête de récupération des paramètres
settings: async (
_args: Record<string, never>,
context: { settingsRepo: SettingsRepository },
) => {
// Récupérer les paramètres depuis la base de données ou une source de données
const maintenanceRaw = await context.settingsRepo.get("maintenance");
return { maintenance: parseBooleanSetting(maintenanceRaw) };
},
// Résolveur pour la mutation de mise à jour des paramètres
updateSettings: async (
args: { maintenance: boolean },
context: { user: jwt.JwtPayload | null; settingsRepo: SettingsRepository },
) => {
// Vérifier que l'utilisateur est authentifié et a les droits nécessaires
checkAuth(context);
// Mettre à jour les paramètres dans la base de données ou une source de données
await context.settingsRepo.set("maintenance", String(args.maintenance));
return { maintenance: args.maintenance };
},
};

export default settingsResolver;
14 changes: 14 additions & 0 deletions src/graphql/schemas/settingsSchema.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
// Type GraphQL pour les paramètres
export const settingsTypes = `
type Settings {
maintenance: Boolean!
}
`;

// Requête GraphQL pour les paramètres
export const settingsQueries = `settings: Settings!`;

// Mutations GraphQL pour les paramètres
export const settingsMutations = `
updateSettings(maintenance: Boolean!): Settings!
`;
1 change: 1 addition & 0 deletions src/utils/initAdmin.ts
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,7 @@ export async function initAdmin(
await settingsRepo.set("login", INIT_LOGIN);
await settingsRepo.set("password_hash", hash);
await settingsRepo.set("email", INIT_EMAIL);
await settingsRepo.set("maintenance", "true");

console.log("Initial admin credentials set.");
}
Loading