Skip to content

Commit

Permalink
refactor: make UserProvider functional
Browse files Browse the repository at this point in the history
  • Loading branch information
AdrianAndersen committed Jan 21, 2025
1 parent 0f46dda commit 56d7a79
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 40 deletions.
4 changes: 2 additions & 2 deletions backend/src/auth/external/facebook.auth.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserProvider } from "@backend/auth/user/user-provider.js";
import UserProvider from "@backend/auth/user/user-provider.js";
import { createPath, retrieveRefererPath } from "@backend/config/api-path.js";
import { APP_CONFIG } from "@backend/config/application-config.js";
import { BlEnv } from "@backend/config/env.js";
Expand Down Expand Up @@ -26,7 +26,7 @@ function createPassportStrategy() {

try {
const username = extractUsername(profile);
userAndTokens = await new UserProvider().loginOrCreate(
userAndTokens = await UserProvider.loginOrCreate(
username,
provider,
providerId,
Expand Down
4 changes: 2 additions & 2 deletions backend/src/auth/external/google.auth.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { UserProvider } from "@backend/auth/user/user-provider.js";
import UserProvider from "@backend/auth/user/user-provider.js";
import { createPath, retrieveRefererPath } from "@backend/config/api-path.js";
import { APP_CONFIG } from "@backend/config/application-config.js";
import { BlEnv } from "@backend/config/env.js";
Expand Down Expand Up @@ -29,7 +29,7 @@ function createPassportStrategy() {
let userAndTokens;

try {
userAndTokens = await new UserProvider().loginOrCreate(
userAndTokens = await UserProvider.loginOrCreate(
username,
provider,
providerId,
Expand Down
61 changes: 32 additions & 29 deletions backend/src/auth/user/user-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,38 +3,41 @@ import TokenHandler from "@backend/auth/token/token.handler.js";
import UserHandler from "@backend/auth/user/user.handler.js";
import { User } from "@backend/types/user.js";

export class UserProvider {
public async loginOrCreate(
username: string,
provider: string,
providerId: string,
): Promise<{
user: User;
tokens: { accessToken: string; refreshToken: string };
}> {
const user = await this.getUser(username, provider, providerId);
async function getUser(
username: string,
provider: string,
providerId: string,
): Promise<User> {
let user;
try {
user = await UserHandler.get(provider, providerId);
} catch {
user = await UserHandler.create(username, provider, providerId);
}

await UserHandler.valid(username);
return user;
}

await LocalLoginHandler.createDefaultLocalLoginIfNoneIsFound(username);
async function loginOrCreate(
username: string,
provider: string,
providerId: string,
): Promise<{
user: User;
tokens: { accessToken: string; refreshToken: string };
}> {
const user = await getUser(username, provider, providerId);

const tokens = await TokenHandler.createTokens(username);
await UserHandler.valid(username);

return { user: user, tokens: tokens };
}
await LocalLoginHandler.createDefaultLocalLoginIfNoneIsFound(username);

private async getUser(
username: string,
provider: string,
providerId: string,
): Promise<User> {
let user;
try {
user = await UserHandler.get(provider, providerId);
} catch {
user = await UserHandler.create(username, provider, providerId);
}

return user;
}
const tokens = await TokenHandler.createTokens(username);

return { user: user, tokens: tokens };
}

const UserProvider = {
loginOrCreate,
};
export default UserProvider;
13 changes: 6 additions & 7 deletions backend/src/tests/user-provider.spec.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import "mocha";
import LocalLoginHandler from "@backend/auth/local/local-login.handler.js";
import TokenHandler from "@backend/auth/token/token.handler.js";
import { UserProvider } from "@backend/auth/user/user-provider.js";
import UserProvider from "@backend/auth/user/user-provider.js";
import UserHandler from "@backend/auth/user/user.handler.js";
import { BlError } from "@shared/bl-error/bl-error.js";
import { expect, use as chaiUse, should } from "chai";
Expand All @@ -18,7 +18,6 @@ describe("UserProvider", () => {
let userValidStub: sinon.SinonStub;
let createTokenStub: sinon.SinonStub;
let createDefaultLocalLoginStub: sinon.SinonStub;
const userProvider = new UserProvider();

beforeEach(() => {
sandbox = createSandbox();
Expand All @@ -41,7 +40,7 @@ describe("UserProvider", () => {
userValidStub.rejects(new BlError("user is not valid"));

return expect(
userProvider.loginOrCreate("[email protected]", "local", "abcdef"),
UserProvider.loginOrCreate("[email protected]", "local", "abcdef"),
).to.eventually.be.rejectedWith(BlError, /user is not valid/);
});

Expand All @@ -53,7 +52,7 @@ describe("UserProvider", () => {
);

return expect(
userProvider.loginOrCreate("[email protected]", "local", "abcde"),
UserProvider.loginOrCreate("[email protected]", "local", "abcde"),
).to.eventually.be.rejectedWith(
BlError,
/local login could not be created/,
Expand All @@ -66,7 +65,7 @@ describe("UserProvider", () => {
userCreateStub.rejects(new BlError("user could not be created"));

return expect(
userProvider.loginOrCreate("[email protected]", "local", "abcde"),
UserProvider.loginOrCreate("[email protected]", "local", "abcde"),
).to.eventually.be.rejectedWith(BlError, /user could not be created/);
});

Expand All @@ -80,7 +79,7 @@ describe("UserProvider", () => {
createTokenStub.resolves(tokens);

return expect(
userProvider.loginOrCreate("[email protected]", "local", "abcdefg"),
UserProvider.loginOrCreate("[email protected]", "local", "abcdefg"),
).to.eventually.be.eql({ user: user, tokens: tokens });
});
});
Expand All @@ -96,7 +95,7 @@ describe("UserProvider", () => {
createTokenStub.resolves(tokens);

return expect(
userProvider.loginOrCreate("[email protected]", "local", "abcdefg"),
UserProvider.loginOrCreate("[email protected]", "local", "abcdefg"),
).to.eventually.be.eql({ user: user, tokens: tokens });
});
});
Expand Down

0 comments on commit 56d7a79

Please sign in to comment.