|
|
@@ -33,6 +33,59 @@ export class TeamDomainService {
|
|
|
return this.teamDomainRepository.save(teamDomain)
|
|
|
}
|
|
|
|
|
|
+ async createBatch(data: CreateTeamDomainBody): Promise<{ success: TeamDomain[], failed: { domain: string, error: string }[] }> {
|
|
|
+ await this.teamService.findById(data.teamId)
|
|
|
+
|
|
|
+ // 解析域名字符串,支持逗号和换行分隔
|
|
|
+ const domains = this.parseDomains(data.domain)
|
|
|
+
|
|
|
+ if (domains.length === 0) {
|
|
|
+ throw new Error('没有有效的域名')
|
|
|
+ }
|
|
|
+
|
|
|
+ const success: TeamDomain[] = []
|
|
|
+ const failed: { domain: string, error: string }[] = []
|
|
|
+
|
|
|
+ // 检查已存在的域名
|
|
|
+ const existingDomains = await this.teamDomainRepository.find({
|
|
|
+ where: { domain: domains.map(d => ({ domain: d })) as any }
|
|
|
+ })
|
|
|
+ const existingDomainSet = new Set(existingDomains.map(d => d.domain))
|
|
|
+
|
|
|
+ // 批量创建域名
|
|
|
+ const domainsToCreate = domains.filter(domain => !existingDomainSet.has(domain))
|
|
|
+
|
|
|
+ if (domainsToCreate.length > 0) {
|
|
|
+ const teamDomains = domainsToCreate.map(domain =>
|
|
|
+ this.teamDomainRepository.create({
|
|
|
+ teamId: data.teamId,
|
|
|
+ domain: domain.trim(),
|
|
|
+ description: data.description
|
|
|
+ })
|
|
|
+ )
|
|
|
+
|
|
|
+ const savedDomains = await this.teamDomainRepository.save(teamDomains)
|
|
|
+ success.push(...savedDomains)
|
|
|
+ }
|
|
|
+
|
|
|
+ // 记录失败的域名(已存在的域名)
|
|
|
+ domains.forEach(domain => {
|
|
|
+ if (existingDomainSet.has(domain)) {
|
|
|
+ failed.push({ domain, error: '域名已存在' })
|
|
|
+ }
|
|
|
+ })
|
|
|
+
|
|
|
+ return { success, failed }
|
|
|
+ }
|
|
|
+
|
|
|
+ private parseDomains(domainString: string): string[] {
|
|
|
+ // 支持中英文逗号、分号和换行分隔,去除空白字符
|
|
|
+ return domainString
|
|
|
+ .split(/[,;\n\r]+/)
|
|
|
+ .map(domain => domain.trim())
|
|
|
+ .filter(domain => domain.length > 0)
|
|
|
+ }
|
|
|
+
|
|
|
async findById(id: number): Promise<TeamDomain> {
|
|
|
return this.teamDomainRepository.findOneOrFail({ where: { id } })
|
|
|
}
|
|
|
@@ -106,4 +159,38 @@ export class TeamDomainService {
|
|
|
order: { createdAt: 'DESC' }
|
|
|
})
|
|
|
}
|
|
|
+
|
|
|
+ async findAllGroupedByTeam(query?: ListTeamDomainQuery): Promise<Record<number, TeamDomain[]>> {
|
|
|
+ const { id, teamId, domain } = query || {}
|
|
|
+
|
|
|
+ const where: any = {}
|
|
|
+
|
|
|
+ if (id) {
|
|
|
+ where.id = id
|
|
|
+ }
|
|
|
+
|
|
|
+ if (teamId) {
|
|
|
+ where.teamId = teamId
|
|
|
+ }
|
|
|
+
|
|
|
+ if (domain) {
|
|
|
+ where.domain = Like(`%${domain}%`)
|
|
|
+ }
|
|
|
+
|
|
|
+ const teamDomains = await this.teamDomainRepository.find({
|
|
|
+ where,
|
|
|
+ order: { teamId: 'ASC', createdAt: 'DESC' }
|
|
|
+ })
|
|
|
+
|
|
|
+ // 按 teamId 分组
|
|
|
+ const groupedData: Record<number, TeamDomain[]> = {}
|
|
|
+ teamDomains.forEach(domain => {
|
|
|
+ if (!groupedData[domain.teamId]) {
|
|
|
+ groupedData[domain.teamId] = []
|
|
|
+ }
|
|
|
+ groupedData[domain.teamId].push(domain)
|
|
|
+ })
|
|
|
+
|
|
|
+ return groupedData
|
|
|
+ }
|
|
|
}
|