From aa87c467f31d7b7e40f0f3dcb4d3fda94efd588d Mon Sep 17 00:00:00 2001 From: Fairpost Date: Sun, 14 Jun 2026 09:30:08 +0200 Subject: [PATCH 1/2] feat: Add more props to user and feed dto --- src/mappers/FeedMapper.ts | 40 +++++++++++++++++++++++++++++++++++++- src/mappers/UserMapper.ts | 41 ++++++++++++++++++++++++++++----------- src/types/FeedDto.ts | 3 +++ src/types/UserDto.ts | 1 + 4 files changed, 73 insertions(+), 12 deletions(-) diff --git a/src/mappers/FeedMapper.ts b/src/mappers/FeedMapper.ts index 2a4be5c..b5710de 100644 --- a/src/mappers/FeedMapper.ts +++ b/src/mappers/FeedMapper.ts @@ -30,6 +30,24 @@ export default class FeedMapper extends AbstractMapper { get: ["manageFeed"], set: ["none"], }, + interval: { + type: "integer", + label: "Interval", + get: ["manageFeed"], + set: ["manageFeed"], + }, + platforms: { + type: "string[]", + label: "Active platforms", + get: ["manageFeed"], + set: ["none"], + }, + connected: { + type: "string[]", + label: "Connected platforms", + get: ["manageFeed"], + set: ["none"], + }, sources: { type: "string[]", label: "Feed sources", @@ -62,6 +80,19 @@ export default class FeedMapper extends AbstractMapper { case "path": dto[field] = this.feed.path; break; + case "interval": + dto[field] = Number(this.user.data.get("settings", "FEED_INTERVAL")); + break; + case "platforms": + dto[field] = this.user.data + .get("settings", "FEED_PLATFORMS") + .split(","); + break; + case "connected": + dto[field] = this.user.data + .get("settings", "FEED_CONNECTED") + .split(","); + break; case "sources": dto[field] = (await this.feed.getSources()).map((s) => s.id); break; @@ -80,7 +111,14 @@ export default class FeedMapper extends AbstractMapper { const fields = this.getDtoFields(operator, "set"); for (const field in dto) { if (fields.includes(field)) { - // there are no settable fields + switch (field) { + case "interval": + const interval = Number( + dto[field] || process.env.FAIRPOST_FEED_INTERVAL, + ); + this.user.data.set("settings", "FEED_INTERVAL", String(interval)); + break; + } } else { this.user.log.trace("Ignoring field: " + field); } diff --git a/src/mappers/UserMapper.ts b/src/mappers/UserMapper.ts index 41cacff..46ce735 100644 --- a/src/mappers/UserMapper.ts +++ b/src/mappers/UserMapper.ts @@ -23,6 +23,13 @@ export default class UserMapper extends AbstractMapper { set: ["none"], required: false, }, + is_public: { + type: "boolean", + label: "Show my profile in public", + get: ["manageUsers"], + set: ["manageUsers"], + required: false, + }, loglevel: { type: "string", label: "Logger level", @@ -51,17 +58,22 @@ export default class UserMapper extends AbstractMapper { model: "user", id: this.user.id, }; - for (const field of fields) { - switch (field) { - case "homedir": - dto[field] = this.user.homedir; - break; - case "loglevel": - dto[field] = this.user.data.get("settings", "LOGGER_LEVEL"); - break; - case "report": - dto[field] = await this.user.getReport(); - break; + for (const field in dto) { + if (fields.includes(field)) { + switch (field) { + case "homedir": + dto[field] = this.user.homedir; + break; + case "is_public": + dto[field] = this.user.data.get("settings", "IS_PUBLIC") === "true"; + break; + case "loglevel": + dto[field] = this.user.data.get("settings", "LOGGER_LEVEL"); + break; + case "report": + dto[field] = await this.user.getReport(); + break; + } } } return dto; @@ -78,6 +90,13 @@ export default class UserMapper extends AbstractMapper { for (const field in dto) { if (fields.includes(field)) { switch (field) { + case "is_public": + this.user.data.set( + "settings", + "IS_PUBLIC", + dto[field] ? "true" : "false", + ); + break; case "loglevel": this.user.data.set( "settings", diff --git a/src/types/FeedDto.ts b/src/types/FeedDto.ts index 550705b..50cb918 100644 --- a/src/types/FeedDto.ts +++ b/src/types/FeedDto.ts @@ -3,5 +3,8 @@ export default interface FeedDto { id: string; user_id: string; path?: string; + interval?: number; + platforms?: string[]; + connected?: string[]; sources?: string[]; } diff --git a/src/types/UserDto.ts b/src/types/UserDto.ts index 712190c..f4fcc13 100644 --- a/src/types/UserDto.ts +++ b/src/types/UserDto.ts @@ -4,6 +4,7 @@ export default interface UserDto { model: string; id: string; homedir?: string; + is_public?: boolean; loglevel?: string; report?: UserReport; } From a45647222c123e3f8d43cbf9e72e4fc19077cfc9 Mon Sep 17 00:00:00 2001 From: Fairpost Date: Sun, 14 Jun 2026 12:27:48 +0200 Subject: [PATCH 2/2] fix: UserMapper permissions --- src/mappers/UserMapper.ts | 39 +++++++++++++++++++-------------------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/src/mappers/UserMapper.ts b/src/mappers/UserMapper.ts index 46ce735..f998a41 100644 --- a/src/mappers/UserMapper.ts +++ b/src/mappers/UserMapper.ts @@ -19,21 +19,21 @@ export default class UserMapper extends AbstractMapper { homedir: { type: "string", label: "Home directory", - get: ["manageUsers"], + get: ["manageAccount"], set: ["none"], required: false, }, is_public: { type: "boolean", label: "Show my profile in public", - get: ["manageUsers"], - set: ["manageUsers"], + get: ["manageAccount"], + set: ["manageAccount"], required: false, }, loglevel: { type: "string", label: "Logger level", - get: ["manageUsers"], + get: ["manageAccount"], set: ["manageUsers"], required: false, }, @@ -58,24 +58,23 @@ export default class UserMapper extends AbstractMapper { model: "user", id: this.user.id, }; - for (const field in dto) { - if (fields.includes(field)) { - switch (field) { - case "homedir": - dto[field] = this.user.homedir; - break; - case "is_public": - dto[field] = this.user.data.get("settings", "IS_PUBLIC") === "true"; - break; - case "loglevel": - dto[field] = this.user.data.get("settings", "LOGGER_LEVEL"); - break; - case "report": - dto[field] = await this.user.getReport(); - break; - } + for (const field of fields) { + switch (field) { + case "homedir": + dto[field] = this.user.homedir; + break; + case "is_public": + dto[field] = this.user.data.get("settings", "IS_PUBLIC") === "true"; + break; + case "loglevel": + dto[field] = this.user.data.get("settings", "LOGGER_LEVEL"); + break; + case "report": + dto[field] = await this.user.getReport(); + break; } } + return dto; }