52 lines
1.2 KiB
TypeScript
52 lines
1.2 KiB
TypeScript
import {
|
|
HasuraInsertEvent,
|
|
TrackedHasuraEventHandler,
|
|
} from '@golevelup/nestjs-hasura';
|
|
import { UserRepository } from './user.repository';
|
|
import { Injectable, Response } from '@nestjs/common';
|
|
import { WorkspaceRepository } from './workspace.repository';
|
|
import { v4 } from 'uuid';
|
|
|
|
interface User {
|
|
id: number;
|
|
email: string;
|
|
}
|
|
|
|
@Injectable()
|
|
export class UserService {
|
|
constructor(
|
|
private repository: UserRepository,
|
|
private workspaceRepository: WorkspaceRepository,
|
|
) {}
|
|
|
|
@TrackedHasuraEventHandler({
|
|
triggerName: 'user-created',
|
|
tableName: 'users',
|
|
schema: 'auth',
|
|
definition: { type: 'insert' },
|
|
})
|
|
async handleUserCreated(evt: HasuraInsertEvent<User>) {
|
|
const emailDomain = evt.event.data.new.email.split('@')[1];
|
|
|
|
if (!emailDomain) {
|
|
return;
|
|
}
|
|
|
|
const workspace = await this.workspaceRepository.findWorkspaceByDomainName({
|
|
where: { domain_name: emailDomain },
|
|
});
|
|
|
|
if (!workspace) {
|
|
return;
|
|
}
|
|
|
|
const workspaceMember = await this.repository.upsertWorkspaceMember({
|
|
data: {
|
|
id: v4(),
|
|
user_id: String(evt.event.data.new.id),
|
|
workspace_id: workspace.id,
|
|
},
|
|
});
|
|
}
|
|
}
|