Skip to content

Commit

Permalink
feat: move token endpoint into token controller
Browse files Browse the repository at this point in the history
  • Loading branch information
AdrianAndersen committed Jan 28, 2025
1 parent 5b43227 commit b7447b3
Show file tree
Hide file tree
Showing 7 changed files with 84 additions and 65 deletions.
20 changes: 20 additions & 0 deletions backend/.adonisjs/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@
import type { MakeTuyauRequest, MakeTuyauResponse } from "@tuyau/utils/types";
import type { InferInput } from "@vinejs/vine/types";

type TokenPost = {
request: MakeTuyauRequest<
InferInput<(typeof import("../app/validators/token.ts"))["tokenValidator"]>
>;
response: MakeTuyauResponse<
import("../app/controllers/auth/tokens_controller.ts").default["token"],
true
>;
};
type AuthIdRedirectGetHead = {
request: unknown;
response: MakeTuyauResponse<
Expand All @@ -22,6 +31,10 @@ type AuthIdCallbackGetHead = {
>;
};
export interface ApiDefinition {
token: {
$url: {};
$post: TokenPost;
};
auth: {
":provider": {
redirect: {
Expand All @@ -38,6 +51,13 @@ export interface ApiDefinition {
};
}
const routes = [
{
params: [],
name: "auth.token",
path: "/token",
method: ["POST"],
types: {} as TokenPost,
},
{
params: ["provider"],
name: "auth.social.redirect",
Expand Down
48 changes: 48 additions & 0 deletions backend/app/controllers/auth/tokens_controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
import { HttpContext } from "@adonisjs/core/http";

import RefreshTokenValidator from "#services/auth/token/refresh/refresh-token.validator";
import TokenHandler from "#services/auth/token/token.handler";
import BlResponseHandler from "#services/response/bl-response.handler";
import { RefreshToken } from "#services/types/refresh-token";
import { BlError } from "#shared/bl-error/bl-error";
import { BlapiResponse } from "#shared/blapi-response/blapi-response";
import { tokenValidator } from "#validators/token";

export default class TokensController {
async token(ctx: HttpContext) {
const { refreshToken } = await ctx.request.validateUsing(tokenValidator);
RefreshTokenValidator.validate(refreshToken).then(
// @ts-expect-error fixme: auto ignored
(validatedRefreshToken: RefreshToken) => {
TokenHandler.createTokens(validatedRefreshToken.username).then(
(jwTokens: { accessToken: string; refreshToken: string }) => {
BlResponseHandler.sendResponse(
ctx,
new BlapiResponse([
{ accessToken: jwTokens.accessToken },
{ refreshToken: jwTokens.refreshToken },
]),
);
},
(createTokenError: BlError) => {
BlResponseHandler.sendErrorResponse(
ctx,
new BlError("could not create tokens")
.store("oldRefreshToken", refreshToken)
.code(906)
.add(createTokenError),
);
},
);
},
(refreshTokenValidationError: BlError) => {
BlResponseHandler.sendErrorResponse(
ctx,
new BlError("refreshToken not valid")
.code(909)
.add(refreshTokenValidationError),
);
},
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,8 @@ import jwt from "jsonwebtoken";
import { BlError } from "#shared/bl-error/bl-error";
import env from "#start/env";

function validate(refreshToken: string | undefined): Promise<unknown> {
function validate(refreshToken: string) {
return new Promise((resolve, reject) => {
if (!refreshToken || refreshToken.length <= 0)
return reject(new BlError("refreshToken is empty or undefined"));

try {
jwt.verify(
refreshToken,
Expand Down
58 changes: 0 additions & 58 deletions backend/app/services/auth/token/token.endpoint.ts

This file was deleted.

7 changes: 7 additions & 0 deletions backend/app/validators/token.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
import vine from "@vinejs/vine";

export const tokenValidator = vine.compile(
vine.object({
refreshToken: vine.string().jwt(),
}),
);
9 changes: 7 additions & 2 deletions backend/start/routes.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,17 @@
import router from "@adonisjs/core/services/router";

import LocalAuth from "#services/auth/local/local.auth";
import TokenEndpoint from "#services/auth/token/token.endpoint";
import CollectionEndpointCreator from "#services/collection-endpoint/collection-endpoint-creator";

const AuthSocialController = () =>
import("#controllers/auth/social_controller");
const AuthTokensController = () =>
import("#controllers/auth/tokens_controller");

/**
* auth token
*/
router.post("/token", [AuthTokensController, "token"]).as("auth.token");

/**
* auth social
Expand All @@ -18,6 +24,5 @@ router
.as("auth.social.callback");

LocalAuth.generateEndpoints();
TokenEndpoint.generateEndpoint();

CollectionEndpointCreator.generateEndpoints();
2 changes: 1 addition & 1 deletion backend/tests/refresh-token.validator.spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ test.group("RefreshTokenValidator", async () => {
"test",
{ expiresIn: "1s" },
(error, refreshToken) => {
RefreshTokenValidator.validate(refreshToken).catch(
RefreshTokenValidator.validate(refreshToken ?? "").catch(
(rtokenError: BlError) => {
rtokenError.getCode().should.be.eql(909);
},
Expand Down

0 comments on commit b7447b3

Please sign in to comment.