mirror of
https://github.com/whekin/household-bot.git
synced 2026-03-31 15:44:02 +00:00
feat(locale): persist household and member preferences
This commit is contained in:
@@ -17,7 +17,8 @@ function createRepositoryStub() {
|
||||
householdName: 'Kojori House',
|
||||
telegramChatId: '-100123',
|
||||
telegramChatType: 'supergroup',
|
||||
title: 'Kojori House'
|
||||
title: 'Kojori House',
|
||||
defaultLocale: 'ru'
|
||||
}
|
||||
const members = new Map<string, HouseholdMemberRecord>()
|
||||
const pendingMembers = new Map<string, HouseholdPendingMemberRecord>()
|
||||
@@ -27,6 +28,8 @@ function createRepositoryStub() {
|
||||
householdId: household.householdId,
|
||||
telegramUserId: '1',
|
||||
displayName: 'Stan',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: household.defaultLocale,
|
||||
isAdmin: true
|
||||
})
|
||||
pendingMembers.set('2', {
|
||||
@@ -35,7 +38,8 @@ function createRepositoryStub() {
|
||||
telegramUserId: '2',
|
||||
displayName: 'Alice',
|
||||
username: 'alice',
|
||||
languageCode: 'en'
|
||||
languageCode: 'en',
|
||||
householdDefaultLocale: household.defaultLocale
|
||||
})
|
||||
|
||||
const repository: HouseholdConfigurationRepository = {
|
||||
@@ -71,7 +75,8 @@ function createRepositoryStub() {
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: input.displayName,
|
||||
username: input.username?.trim() || null,
|
||||
languageCode: input.languageCode?.trim() || null
|
||||
languageCode: input.languageCode?.trim() || null,
|
||||
householdDefaultLocale: household.defaultLocale
|
||||
}
|
||||
pendingMembers.set(input.telegramUserId, record)
|
||||
return record
|
||||
@@ -86,6 +91,8 @@ function createRepositoryStub() {
|
||||
householdId: input.householdId,
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: input.displayName,
|
||||
preferredLocale: input.preferredLocale ?? null,
|
||||
householdDefaultLocale: household.defaultLocale,
|
||||
isAdmin: input.isAdmin === true
|
||||
}
|
||||
members.set(input.telegramUserId, record)
|
||||
@@ -110,10 +117,25 @@ function createRepositoryStub() {
|
||||
householdId: pending.householdId,
|
||||
telegramUserId: pending.telegramUserId,
|
||||
displayName: pending.displayName,
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: household.defaultLocale,
|
||||
isAdmin: input.isAdmin === true
|
||||
}
|
||||
members.set(member.telegramUserId, member)
|
||||
return member
|
||||
},
|
||||
updateHouseholdDefaultLocale: async (_householdId, locale) => ({
|
||||
...household,
|
||||
defaultLocale: locale
|
||||
}),
|
||||
updateMemberPreferredLocale: async (_householdId, telegramUserId, locale) => {
|
||||
const member = members.get(telegramUserId)
|
||||
return member
|
||||
? {
|
||||
...member,
|
||||
preferredLocale: locale
|
||||
}
|
||||
: null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -144,7 +166,8 @@ describe('createHouseholdAdminService', () => {
|
||||
telegramUserId: '2',
|
||||
displayName: 'Alice',
|
||||
username: 'alice',
|
||||
languageCode: 'en'
|
||||
languageCode: 'en',
|
||||
householdDefaultLocale: 'ru'
|
||||
}
|
||||
])
|
||||
})
|
||||
@@ -182,6 +205,8 @@ describe('createHouseholdAdminService', () => {
|
||||
householdId: 'household-1',
|
||||
telegramUserId: '2',
|
||||
displayName: 'Alice',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: false
|
||||
}
|
||||
})
|
||||
|
||||
@@ -17,7 +17,8 @@ function createRepositoryStub() {
|
||||
householdName: 'Kojori House',
|
||||
telegramChatId: '-100123',
|
||||
telegramChatType: 'supergroup',
|
||||
title: 'Kojori House'
|
||||
title: 'Kojori House',
|
||||
defaultLocale: 'ru'
|
||||
}
|
||||
let joinToken: HouseholdJoinTokenRecord | null = null
|
||||
const pendingMembers = new Map<string, HouseholdPendingMemberRecord>()
|
||||
@@ -76,7 +77,8 @@ function createRepositoryStub() {
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: input.displayName,
|
||||
username: input.username?.trim() || null,
|
||||
languageCode: input.languageCode?.trim() || null
|
||||
languageCode: input.languageCode?.trim() || null,
|
||||
householdDefaultLocale: household.defaultLocale
|
||||
}
|
||||
pendingMembers.set(input.telegramUserId, record)
|
||||
return record
|
||||
@@ -93,6 +95,8 @@ function createRepositoryStub() {
|
||||
householdId: input.householdId,
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: input.displayName,
|
||||
preferredLocale: input.preferredLocale ?? null,
|
||||
householdDefaultLocale: household.defaultLocale,
|
||||
isAdmin: input.isAdmin === true
|
||||
}
|
||||
members.set(input.telegramUserId, member)
|
||||
@@ -124,8 +128,25 @@ function createRepositoryStub() {
|
||||
householdId: pending.householdId,
|
||||
telegramUserId: pending.telegramUserId,
|
||||
displayName: pending.displayName,
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: household.defaultLocale,
|
||||
isAdmin: input.isAdmin === true
|
||||
}
|
||||
},
|
||||
async updateHouseholdDefaultLocale(_householdId, locale) {
|
||||
return {
|
||||
...household,
|
||||
defaultLocale: locale
|
||||
}
|
||||
},
|
||||
async updateMemberPreferredLocale(_householdId, telegramUserId, locale) {
|
||||
const member = members.get(telegramUserId)
|
||||
return member
|
||||
? {
|
||||
...member,
|
||||
preferredLocale: locale
|
||||
}
|
||||
: null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,7 +197,8 @@ describe('createHouseholdOnboardingService', () => {
|
||||
status: 'join_required',
|
||||
household: {
|
||||
id: 'household-1',
|
||||
name: 'Kojori House'
|
||||
name: 'Kojori House',
|
||||
defaultLocale: 'ru'
|
||||
}
|
||||
})
|
||||
})
|
||||
@@ -204,7 +226,8 @@ describe('createHouseholdOnboardingService', () => {
|
||||
status: 'pending',
|
||||
household: {
|
||||
id: 'household-1',
|
||||
name: 'Kojori House'
|
||||
name: 'Kojori House',
|
||||
defaultLocale: 'ru'
|
||||
}
|
||||
})
|
||||
|
||||
@@ -219,7 +242,8 @@ describe('createHouseholdOnboardingService', () => {
|
||||
status: 'pending',
|
||||
household: {
|
||||
id: 'household-1',
|
||||
name: 'Kojori House'
|
||||
name: 'Kojori House',
|
||||
defaultLocale: 'ru'
|
||||
}
|
||||
})
|
||||
})
|
||||
@@ -250,6 +274,8 @@ describe('createHouseholdOnboardingService', () => {
|
||||
id: 'member-42',
|
||||
householdId: 'household-1',
|
||||
displayName: 'Stan',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: true
|
||||
}
|
||||
})
|
||||
@@ -262,6 +288,8 @@ describe('createHouseholdOnboardingService', () => {
|
||||
householdId: 'household-1',
|
||||
telegramUserId: '42',
|
||||
displayName: 'Stan',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: true
|
||||
}
|
||||
const service = createHouseholdOnboardingService({ repository })
|
||||
@@ -277,6 +305,8 @@ describe('createHouseholdOnboardingService', () => {
|
||||
householdId: 'household-2',
|
||||
telegramUserId: '42',
|
||||
displayName: 'Stan elsewhere',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: false
|
||||
}
|
||||
]
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import { randomBytes } from 'node:crypto'
|
||||
|
||||
import type { SupportedLocale } from '@household/domain'
|
||||
import type { HouseholdConfigurationRepository, HouseholdMemberRecord } from '@household/ports'
|
||||
|
||||
export interface HouseholdOnboardingIdentity {
|
||||
@@ -17,6 +18,8 @@ export type HouseholdMiniAppAccess =
|
||||
householdId: string
|
||||
displayName: string
|
||||
isAdmin: boolean
|
||||
preferredLocale: SupportedLocale | null
|
||||
householdDefaultLocale: SupportedLocale
|
||||
}
|
||||
}
|
||||
| {
|
||||
@@ -24,6 +27,7 @@ export type HouseholdMiniAppAccess =
|
||||
household: {
|
||||
id: string
|
||||
name: string
|
||||
defaultLocale: SupportedLocale
|
||||
}
|
||||
}
|
||||
| {
|
||||
@@ -31,6 +35,7 @@ export type HouseholdMiniAppAccess =
|
||||
household: {
|
||||
id: string
|
||||
name: string
|
||||
defaultLocale: SupportedLocale
|
||||
}
|
||||
}
|
||||
| {
|
||||
@@ -53,6 +58,7 @@ export interface HouseholdOnboardingService {
|
||||
household: {
|
||||
id: string
|
||||
name: string
|
||||
defaultLocale: SupportedLocale
|
||||
}
|
||||
}
|
||||
| {
|
||||
@@ -62,6 +68,8 @@ export interface HouseholdOnboardingService {
|
||||
householdId: string
|
||||
displayName: string
|
||||
isAdmin: boolean
|
||||
preferredLocale: SupportedLocale | null
|
||||
householdDefaultLocale: SupportedLocale
|
||||
}
|
||||
}
|
||||
| {
|
||||
@@ -75,12 +83,16 @@ function toMember(member: HouseholdMemberRecord): {
|
||||
householdId: string
|
||||
displayName: string
|
||||
isAdmin: boolean
|
||||
preferredLocale: SupportedLocale | null
|
||||
householdDefaultLocale: SupportedLocale
|
||||
} {
|
||||
return {
|
||||
id: member.id,
|
||||
householdId: member.householdId,
|
||||
displayName: member.displayName,
|
||||
isAdmin: member.isAdmin
|
||||
isAdmin: member.isAdmin,
|
||||
preferredLocale: member.preferredLocale,
|
||||
householdDefaultLocale: member.householdDefaultLocale
|
||||
}
|
||||
}
|
||||
|
||||
@@ -155,7 +167,8 @@ export function createHouseholdOnboardingService(options: {
|
||||
status: 'pending',
|
||||
household: {
|
||||
id: existingPending.householdId,
|
||||
name: existingPending.householdName
|
||||
name: existingPending.householdName,
|
||||
defaultLocale: existingPending.householdDefaultLocale
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -182,7 +195,8 @@ export function createHouseholdOnboardingService(options: {
|
||||
status: 'pending',
|
||||
household: {
|
||||
id: pending.householdId,
|
||||
name: pending.householdName
|
||||
name: pending.householdName,
|
||||
defaultLocale: pending.householdDefaultLocale
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -191,7 +205,8 @@ export function createHouseholdOnboardingService(options: {
|
||||
status: 'join_required',
|
||||
household: {
|
||||
id: household.householdId,
|
||||
name: household.householdName
|
||||
name: household.householdName,
|
||||
defaultLocale: household.defaultLocale
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -235,7 +250,8 @@ export function createHouseholdOnboardingService(options: {
|
||||
status: 'pending',
|
||||
household: {
|
||||
id: pending.householdId,
|
||||
name: pending.householdName
|
||||
name: pending.householdName,
|
||||
defaultLocale: pending.householdDefaultLocale
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,7 +39,8 @@ function createRepositoryStub() {
|
||||
householdName: input.householdName,
|
||||
telegramChatId: input.telegramChatId,
|
||||
telegramChatType: input.telegramChatType,
|
||||
title: input.title?.trim() || null
|
||||
title: input.title?.trim() || null,
|
||||
defaultLocale: 'ru'
|
||||
}
|
||||
households.set(input.telegramChatId, created)
|
||||
|
||||
@@ -141,7 +142,8 @@ function createRepositoryStub() {
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: input.displayName,
|
||||
username: input.username?.trim() || null,
|
||||
languageCode: input.languageCode?.trim() || null
|
||||
languageCode: input.languageCode?.trim() || null,
|
||||
householdDefaultLocale: household.defaultLocale
|
||||
}
|
||||
pendingMembers.set(key, record)
|
||||
return record
|
||||
@@ -166,6 +168,10 @@ function createRepositoryStub() {
|
||||
householdId: input.householdId,
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: input.displayName,
|
||||
preferredLocale: input.preferredLocale ?? existing?.preferredLocale ?? null,
|
||||
householdDefaultLocale:
|
||||
[...households.values()].find((household) => household.householdId === input.householdId)
|
||||
?.defaultLocale ?? 'ru',
|
||||
isAdmin: input.isAdmin === true || existing?.isAdmin === true
|
||||
}
|
||||
members.set(key, next)
|
||||
@@ -202,10 +208,39 @@ function createRepositoryStub() {
|
||||
householdId: pending.householdId,
|
||||
telegramUserId: pending.telegramUserId,
|
||||
displayName: pending.displayName,
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale:
|
||||
[...households.values()].find(
|
||||
(household) => household.householdId === pending.householdId
|
||||
)?.defaultLocale ?? 'ru',
|
||||
isAdmin: input.isAdmin === true
|
||||
}
|
||||
members.set(key, member)
|
||||
return member
|
||||
},
|
||||
async updateHouseholdDefaultLocale(householdId, locale) {
|
||||
const household =
|
||||
[...households.values()].find((entry) => entry.householdId === householdId) ?? null
|
||||
if (!household) {
|
||||
throw new Error('Missing household')
|
||||
}
|
||||
|
||||
const next = {
|
||||
...household,
|
||||
defaultLocale: locale
|
||||
}
|
||||
households.set(next.telegramChatId, next)
|
||||
return next
|
||||
},
|
||||
async updateMemberPreferredLocale(householdId, telegramUserId, locale) {
|
||||
const key = `${householdId}:${telegramUserId}`
|
||||
const member = members.get(key)
|
||||
return member
|
||||
? {
|
||||
...member,
|
||||
preferredLocale: locale
|
||||
}
|
||||
: null
|
||||
}
|
||||
}
|
||||
|
||||
@@ -240,6 +275,8 @@ describe('createHouseholdSetupService', () => {
|
||||
householdId: result.household.householdId,
|
||||
telegramUserId: '42',
|
||||
displayName: 'Stan',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: true
|
||||
})
|
||||
})
|
||||
@@ -275,6 +312,8 @@ describe('createHouseholdSetupService', () => {
|
||||
householdId: result.household.householdId,
|
||||
telegramUserId: '77',
|
||||
displayName: 'Mia',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: true
|
||||
})
|
||||
})
|
||||
|
||||
@@ -19,6 +19,10 @@ export {
|
||||
type ReminderJobResult,
|
||||
type ReminderJobService
|
||||
} from './reminder-job-service'
|
||||
export {
|
||||
createLocalePreferenceService,
|
||||
type LocalePreferenceService
|
||||
} from './locale-preference-service'
|
||||
export {
|
||||
parsePurchaseMessage,
|
||||
type ParsedPurchaseResult,
|
||||
|
||||
115
packages/application/src/locale-preference-service.test.ts
Normal file
115
packages/application/src/locale-preference-service.test.ts
Normal file
@@ -0,0 +1,115 @@
|
||||
import { describe, expect, test } from 'bun:test'
|
||||
|
||||
import type { HouseholdConfigurationRepository, HouseholdMemberRecord } from '@household/ports'
|
||||
|
||||
import { createLocalePreferenceService } from './locale-preference-service'
|
||||
|
||||
function createRepository(): HouseholdConfigurationRepository {
|
||||
const household = {
|
||||
householdId: 'household-1',
|
||||
householdName: 'Kojori House',
|
||||
telegramChatId: '-100123',
|
||||
telegramChatType: 'supergroup',
|
||||
title: 'Kojori House',
|
||||
defaultLocale: 'ru' as const
|
||||
}
|
||||
|
||||
const member: HouseholdMemberRecord = {
|
||||
id: 'member-1',
|
||||
householdId: 'household-1',
|
||||
telegramUserId: '123456',
|
||||
displayName: 'Stan',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: true
|
||||
}
|
||||
|
||||
return {
|
||||
registerTelegramHouseholdChat: async () => ({ status: 'existing', household }),
|
||||
getTelegramHouseholdChat: async () => household,
|
||||
getHouseholdChatByHouseholdId: async () => household,
|
||||
bindHouseholdTopic: async (input) => ({
|
||||
householdId: input.householdId,
|
||||
role: input.role,
|
||||
telegramThreadId: input.telegramThreadId,
|
||||
topicName: input.topicName?.trim() || null
|
||||
}),
|
||||
getHouseholdTopicBinding: async () => null,
|
||||
findHouseholdTopicByTelegramContext: async () => null,
|
||||
listHouseholdTopicBindings: async () => [],
|
||||
upsertHouseholdJoinToken: async () => ({
|
||||
householdId: household.householdId,
|
||||
householdName: household.householdName,
|
||||
token: 'join-token',
|
||||
createdByTelegramUserId: null
|
||||
}),
|
||||
getHouseholdJoinToken: async () => null,
|
||||
getHouseholdByJoinToken: async () => household,
|
||||
upsertPendingHouseholdMember: async (input) => ({
|
||||
householdId: input.householdId,
|
||||
householdName: household.householdName,
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: input.displayName,
|
||||
username: input.username?.trim() || null,
|
||||
languageCode: input.languageCode?.trim() || null,
|
||||
householdDefaultLocale: 'ru'
|
||||
}),
|
||||
getPendingHouseholdMember: async () => null,
|
||||
findPendingHouseholdMemberByTelegramUserId: async () => null,
|
||||
ensureHouseholdMember: async () => member,
|
||||
getHouseholdMember: async () => member,
|
||||
listHouseholdMembers: async () => [member],
|
||||
listHouseholdMembersByTelegramUserId: async () => [member],
|
||||
listPendingHouseholdMembers: async () => [],
|
||||
approvePendingHouseholdMember: async () => member,
|
||||
updateHouseholdDefaultLocale: async (_householdId, locale) => ({
|
||||
...household,
|
||||
defaultLocale: locale
|
||||
}),
|
||||
updateMemberPreferredLocale: async (_householdId, telegramUserId, locale) =>
|
||||
telegramUserId === member.telegramUserId
|
||||
? {
|
||||
...member,
|
||||
preferredLocale: locale,
|
||||
householdDefaultLocale: 'ru'
|
||||
}
|
||||
: null
|
||||
}
|
||||
}
|
||||
|
||||
describe('createLocalePreferenceService', () => {
|
||||
test('updates member locale preference', async () => {
|
||||
const service = createLocalePreferenceService(createRepository())
|
||||
|
||||
const result = await service.updateMemberLocale({
|
||||
householdId: 'household-1',
|
||||
telegramUserId: '123456',
|
||||
locale: 'en'
|
||||
})
|
||||
|
||||
expect(result).toEqual({
|
||||
status: 'updated',
|
||||
member: {
|
||||
householdId: 'household-1',
|
||||
telegramUserId: '123456',
|
||||
preferredLocale: 'en',
|
||||
householdDefaultLocale: 'ru'
|
||||
}
|
||||
})
|
||||
})
|
||||
|
||||
test('rejects household locale update for non-admin actors', async () => {
|
||||
const service = createLocalePreferenceService(createRepository())
|
||||
|
||||
const result = await service.updateHouseholdLocale({
|
||||
householdId: 'household-1',
|
||||
actorIsAdmin: false,
|
||||
locale: 'en'
|
||||
})
|
||||
|
||||
expect(result).toEqual({
|
||||
status: 'rejected',
|
||||
reason: 'not_admin'
|
||||
})
|
||||
})
|
||||
})
|
||||
94
packages/application/src/locale-preference-service.ts
Normal file
94
packages/application/src/locale-preference-service.ts
Normal file
@@ -0,0 +1,94 @@
|
||||
import type { SupportedLocale } from '@household/domain'
|
||||
import type { HouseholdConfigurationRepository } from '@household/ports'
|
||||
|
||||
export interface LocalePreferenceService {
|
||||
updateMemberLocale(input: {
|
||||
householdId: string
|
||||
telegramUserId: string
|
||||
locale: SupportedLocale
|
||||
}): Promise<
|
||||
| {
|
||||
status: 'updated'
|
||||
member: {
|
||||
householdId: string
|
||||
telegramUserId: string
|
||||
preferredLocale: SupportedLocale | null
|
||||
householdDefaultLocale: SupportedLocale
|
||||
}
|
||||
}
|
||||
| {
|
||||
status: 'rejected'
|
||||
reason: 'member_not_found'
|
||||
}
|
||||
>
|
||||
updateHouseholdLocale(input: {
|
||||
householdId: string
|
||||
actorIsAdmin: boolean
|
||||
locale: SupportedLocale
|
||||
}): Promise<
|
||||
| {
|
||||
status: 'updated'
|
||||
household: {
|
||||
householdId: string
|
||||
defaultLocale: SupportedLocale
|
||||
}
|
||||
}
|
||||
| {
|
||||
status: 'rejected'
|
||||
reason: 'not_admin'
|
||||
}
|
||||
>
|
||||
}
|
||||
|
||||
export function createLocalePreferenceService(
|
||||
repository: HouseholdConfigurationRepository
|
||||
): LocalePreferenceService {
|
||||
return {
|
||||
async updateMemberLocale(input) {
|
||||
const member = await repository.updateMemberPreferredLocale(
|
||||
input.householdId,
|
||||
input.telegramUserId,
|
||||
input.locale
|
||||
)
|
||||
|
||||
if (!member) {
|
||||
return {
|
||||
status: 'rejected',
|
||||
reason: 'member_not_found' as const
|
||||
}
|
||||
}
|
||||
|
||||
return {
|
||||
status: 'updated',
|
||||
member: {
|
||||
householdId: member.householdId,
|
||||
telegramUserId: member.telegramUserId,
|
||||
preferredLocale: member.preferredLocale,
|
||||
householdDefaultLocale: member.householdDefaultLocale
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
async updateHouseholdLocale(input) {
|
||||
if (!input.actorIsAdmin) {
|
||||
return {
|
||||
status: 'rejected',
|
||||
reason: 'not_admin' as const
|
||||
}
|
||||
}
|
||||
|
||||
const household = await repository.updateHouseholdDefaultLocale(
|
||||
input.householdId,
|
||||
input.locale
|
||||
)
|
||||
|
||||
return {
|
||||
status: 'updated',
|
||||
household: {
|
||||
householdId: household.householdId,
|
||||
defaultLocale: household.defaultLocale
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -13,7 +13,8 @@ function repository(): HouseholdConfigurationRepository {
|
||||
householdName: 'Kojori House',
|
||||
telegramChatId: '-100123',
|
||||
telegramChatType: 'supergroup',
|
||||
title: 'Kojori House'
|
||||
title: 'Kojori House',
|
||||
defaultLocale: 'ru'
|
||||
}
|
||||
}),
|
||||
getTelegramHouseholdChat: async () => null,
|
||||
@@ -41,7 +42,8 @@ function repository(): HouseholdConfigurationRepository {
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: input.displayName,
|
||||
username: input.username?.trim() || null,
|
||||
languageCode: input.languageCode?.trim() || null
|
||||
languageCode: input.languageCode?.trim() || null,
|
||||
householdDefaultLocale: 'ru'
|
||||
}),
|
||||
getPendingHouseholdMember: async () => null,
|
||||
findPendingHouseholdMemberByTelegramUserId: async () => null,
|
||||
@@ -50,6 +52,8 @@ function repository(): HouseholdConfigurationRepository {
|
||||
householdId: input.householdId,
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: input.displayName,
|
||||
preferredLocale: input.preferredLocale ?? null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: input.isAdmin === true
|
||||
}),
|
||||
getHouseholdMember: async () => null,
|
||||
@@ -62,7 +66,8 @@ function repository(): HouseholdConfigurationRepository {
|
||||
telegramUserId: '123456',
|
||||
displayName: 'Stan',
|
||||
username: 'stan',
|
||||
languageCode: 'ru'
|
||||
languageCode: 'ru',
|
||||
householdDefaultLocale: 'ru'
|
||||
}
|
||||
],
|
||||
approvePendingHouseholdMember: async (input) =>
|
||||
@@ -72,6 +77,28 @@ function repository(): HouseholdConfigurationRepository {
|
||||
householdId: input.householdId,
|
||||
telegramUserId: input.telegramUserId,
|
||||
displayName: 'Stan',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: false
|
||||
}
|
||||
: null,
|
||||
updateHouseholdDefaultLocale: async (_householdId, locale) => ({
|
||||
householdId: 'household-1',
|
||||
householdName: 'Kojori House',
|
||||
telegramChatId: '-100123',
|
||||
telegramChatType: 'supergroup',
|
||||
title: 'Kojori House',
|
||||
defaultLocale: locale
|
||||
}),
|
||||
updateMemberPreferredLocale: async (_householdId, telegramUserId, locale) =>
|
||||
telegramUserId === '123456'
|
||||
? {
|
||||
id: 'member-123456',
|
||||
householdId: 'household-1',
|
||||
telegramUserId,
|
||||
displayName: 'Stan',
|
||||
preferredLocale: locale,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: false
|
||||
}
|
||||
: null
|
||||
@@ -96,7 +123,8 @@ describe('createMiniAppAdminService', () => {
|
||||
telegramUserId: '123456',
|
||||
displayName: 'Stan',
|
||||
username: 'stan',
|
||||
languageCode: 'ru'
|
||||
languageCode: 'ru',
|
||||
householdDefaultLocale: 'ru'
|
||||
}
|
||||
]
|
||||
})
|
||||
@@ -132,6 +160,8 @@ describe('createMiniAppAdminService', () => {
|
||||
householdId: 'household-1',
|
||||
telegramUserId: '123456',
|
||||
displayName: 'Stan',
|
||||
preferredLocale: null,
|
||||
householdDefaultLocale: 'ru',
|
||||
isAdmin: false
|
||||
}
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user