mirror of
https://github.com/fluxerapp/fluxer
synced 2026-10-10 04:32:34 +09:00
51 lines
1.9 KiB
TypeScript
51 lines
1.9 KiB
TypeScript
// SPDX-License-Identifier: AGPL-3.0-or-later
|
|
|
|
import type {LookupUserRequest} from '@fluxer/schema/src/domains/admin/AdminUserSchemas';
|
|
import type {ApiContext} from '../../ApiContext';
|
|
import {createUserID} from '../../BrandedTypes';
|
|
import {isSyntheticUserId} from '../../constants/Core';
|
|
import {Logger} from '../../Logger';
|
|
import {mapUserToAdminResponse} from '../models/UserTypes';
|
|
|
|
interface AdminUserLookupServiceDeps {
|
|
apiContext: ApiContext;
|
|
}
|
|
|
|
export class AdminUserLookupService {
|
|
constructor(private readonly deps: AdminUserLookupServiceDeps) {}
|
|
|
|
async lookupUser(data: LookupUserRequest, acls: ReadonlySet<string>) {
|
|
const {users: userRepository, cache: cacheService} = this.deps.apiContext.services;
|
|
if ('user_ids' in data) {
|
|
const userIds = data.user_ids.map((id) => createUserID(id));
|
|
const users = await userRepository.listUsers(userIds);
|
|
return {
|
|
users: await Promise.all(users.map((user) => mapUserToAdminResponse(user, cacheService, acls))),
|
|
};
|
|
}
|
|
let user = null;
|
|
const query = data.query.trim();
|
|
const fluxerTagMatch = query.match(/^(.+)#(\d{1,4})$/);
|
|
if (fluxerTagMatch) {
|
|
const username = fluxerTagMatch[1];
|
|
const discriminator = parseInt(fluxerTagMatch[2], 10);
|
|
user = await userRepository.findByUsernameDiscriminator(username, discriminator);
|
|
} else if (/^\d+$/.test(query)) {
|
|
try {
|
|
const userId = createUserID(BigInt(query));
|
|
user = isSyntheticUserId(userId) ? null : await userRepository.findUnique(userId);
|
|
} catch (error) {
|
|
Logger.debug({query, error}, 'Failed to lookup user by numeric ID, invalid ID format');
|
|
user = null;
|
|
}
|
|
} else if (query.includes('@')) {
|
|
user = await userRepository.findByEmail(query);
|
|
} else {
|
|
user = await userRepository.findByStripeSubscriptionId(query);
|
|
}
|
|
return {
|
|
users: user ? [await mapUserToAdminResponse(user, cacheService, acls)] : [],
|
|
};
|
|
}
|
|
}
|