/*
* Copyright (C) 2026 Fluxer Contributors
*
* This file is part of Fluxer.
*
* Fluxer is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Fluxer is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with Fluxer. If not, see .
*/
import type {GuildID, UserID} from '~/BrandedTypes';
import type {IChannelRepository} from '~/channel/IChannelRepository';
import type {ChannelService} from '~/channel/services/ChannelService';
import type {
GuildCreateRequest,
GuildPartialResponse,
GuildResponse,
GuildUpdateRequest,
GuildVanityURLResponse,
} from '~/guild/GuildModel';
import type {EntityAssetService} from '~/infrastructure/EntityAssetService';
import type {IGatewayService} from '~/infrastructure/IGatewayService';
import type {SnowflakeService} from '~/infrastructure/SnowflakeService';
import type {InviteRepository} from '~/invite/InviteRepository';
import type {Guild, GuildMember, User} from '~/Models';
import type {RequestCache} from '~/middleware/RequestCacheMiddleware';
import type {IUserRepository} from '~/user/IUserRepository';
import type {IWebhookRepository} from '~/webhook/IWebhookRepository';
import type {GuildAuditLogService} from '../GuildAuditLogService';
import type {IGuildRepository} from '../IGuildRepository';
import {GuildDataHelpers} from './data/GuildDataHelpers';
import {GuildOperationsService} from './data/GuildOperationsService';
import {GuildOwnershipService} from './data/GuildOwnershipService';
import {GuildVanityService} from './data/GuildVanityService';
export class GuildDataService {
private readonly helpers: GuildDataHelpers;
private readonly operationsService: GuildOperationsService;
private readonly vanityService: GuildVanityService;
private readonly ownershipService: GuildOwnershipService;
constructor(
private readonly guildRepository: IGuildRepository,
private readonly channelRepository: IChannelRepository,
private readonly inviteRepository: InviteRepository,
private readonly channelService: ChannelService,
private readonly gatewayService: IGatewayService,
private readonly entityAssetService: EntityAssetService,
private readonly userRepository: IUserRepository,
private readonly snowflakeService: SnowflakeService,
private readonly webhookRepository: IWebhookRepository,
private readonly guildAuditLogService: GuildAuditLogService,
) {
this.helpers = new GuildDataHelpers(this.gatewayService, this.guildAuditLogService);
this.operationsService = new GuildOperationsService(
this.guildRepository,
this.channelRepository,
this.inviteRepository,
this.channelService,
this.gatewayService,
this.entityAssetService,
this.userRepository,
this.snowflakeService,
this.webhookRepository,
this.helpers,
);
this.vanityService = new GuildVanityService(this.guildRepository, this.inviteRepository, this.helpers);
this.ownershipService = new GuildOwnershipService(this.guildRepository, this.userRepository, this.helpers);
}
async getGuild({userId, guildId}: {userId: UserID; guildId: GuildID}): Promise {
return this.operationsService.getGuild({userId, guildId});
}
async getUserGuilds(userId: UserID): Promise> {
return this.operationsService.getUserGuilds(userId);
}
async getPublicGuildData(guildId: GuildID): Promise {
return this.operationsService.getPublicGuildData(guildId);
}
async getGuildSystem(guildId: GuildID): Promise {
return this.operationsService.getGuildSystem(guildId);
}
async createGuild(
params: {user: User; data: GuildCreateRequest},
auditLogReason?: string | null,
): Promise {
return this.operationsService.createGuild(params, auditLogReason);
}
async updateGuild(
params: {userId: UserID; guildId: GuildID; data: GuildUpdateRequest; requestCache: RequestCache},
auditLogReason?: string | null,
): Promise {
return this.operationsService.updateGuild(params, auditLogReason);
}
async getVanityURL(params: {userId: UserID; guildId: GuildID}): Promise {
return this.vanityService.getVanityURL(params);
}
async updateVanityURL(
params: {userId: UserID; guildId: GuildID; code: string | null; requestCache: RequestCache},
auditLogReason?: string | null,
): Promise<{code: string}> {
return this.vanityService.updateVanityURL(params, auditLogReason);
}
async deleteGuild(params: {user: User; guildId: GuildID}, auditLogReason?: string | null): Promise {
return this.operationsService.deleteGuild(params, auditLogReason);
}
async deleteGuildForAdmin(guildId: GuildID, _auditLogReason?: string | null): Promise {
return this.operationsService.deleteGuildById(guildId);
}
async transferOwnership(
params: {userId: UserID; guildId: GuildID; newOwnerId: UserID},
auditLogReason?: string | null,
): Promise {
return this.ownershipService.transferOwnership(params, auditLogReason);
}
async checkGuildVerification(params: {user: User; guild: Guild; member: GuildMember}): Promise {
return this.ownershipService.checkGuildVerification(params);
}
}