refactor(server): use user model on oauth plugin (#10031)

close CLOUD-117
This commit is contained in:
fengmk2
2025-02-10 12:01:14 +00:00
parent 23364b59a0
commit 67b6c28d67
5 changed files with 48 additions and 64 deletions
@@ -7,7 +7,7 @@ import {
Req,
Res,
} from '@nestjs/common';
import { ConnectedAccount, PrismaClient } from '@prisma/client';
import { ConnectedAccount } from '@prisma/client';
import type { Request, Response } from 'express';
import {
@@ -30,8 +30,7 @@ export class OAuthController {
private readonly auth: AuthService,
private readonly oauth: OAuthService,
private readonly models: Models,
private readonly providerFactory: OAuthProviderFactory,
private readonly db: PrismaClient
private readonly providerFactory: OAuthProviderFactory
) {}
@Public()
@@ -120,48 +119,39 @@ export class OAuthController {
externalAccount: OAuthAccount,
tokens: Tokens
) {
const connectedUser = await this.db.connectedAccount.findFirst({
where: {
provider,
providerAccountId: externalAccount.id,
},
include: {
user: true,
},
});
const connectedAccount = await this.models.user.getConnectedAccount(
provider,
externalAccount.id
);
if (connectedUser) {
if (connectedAccount) {
// already connected
await this.updateConnectedAccount(connectedUser, tokens);
return connectedUser.user;
await this.updateConnectedAccount(connectedAccount, tokens);
return connectedAccount.user;
}
const user = await this.models.user.fulfill(externalAccount.email, {
avatarUrl: externalAccount.avatarUrl,
});
await this.db.connectedAccount.create({
data: {
userId: user.id,
provider,
providerAccountId: externalAccount.id,
...tokens,
},
await this.models.user.createConnectedAccount({
userId: user.id,
provider,
providerAccountId: externalAccount.id,
...tokens,
});
return user;
}
private async updateConnectedAccount(
connectedUser: ConnectedAccount,
connectedAccount: ConnectedAccount,
tokens: Tokens
) {
return this.db.connectedAccount.update({
where: {
id: connectedUser.id,
},
data: tokens,
});
return await this.models.user.updateConnectedAccount(
connectedAccount.id,
tokens
);
}
/**
@@ -175,26 +165,20 @@ export class OAuthController {
externalAccount: OAuthAccount,
tokens: Tokens
) {
const connectedUser = await this.db.connectedAccount.findFirst({
where: {
provider,
providerAccountId: externalAccount.id,
},
});
if (connectedUser) {
if (connectedUser.id !== user.id) {
const connectedAccount = await this.models.user.getConnectedAccount(
provider,
externalAccount.id
);
if (connectedAccount) {
if (connectedAccount.userId !== user.id) {
throw new OauthAccountAlreadyConnected();
}
} else {
await this.db.connectedAccount.create({
data: {
userId: user.id,
provider,
providerAccountId: externalAccount.id,
accessToken: tokens.accessToken,
refreshToken: tokens.refreshToken,
},
await this.models.user.createConnectedAccount({
userId: user.id,
provider,
providerAccountId: externalAccount.id,
...tokens,
});
}
}