Skip to content

Commit

Permalink
feature: rename site-header -> get-site-header #364
Browse files Browse the repository at this point in the history
  • Loading branch information
maany committed Sep 27, 2023
1 parent 8cd2ae2 commit 615aca6
Show file tree
Hide file tree
Showing 18 changed files with 229 additions and 131 deletions.
13 changes: 13 additions & 0 deletions src/lib/core/port/primary/get-site-header-ports.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
import { BaseInputPort, BaseOutputPort } from "@/lib/sdk/primary-ports";
import { IronSession } from "iron-session";
import { GetSiteHeaderError, GetSiteHeaderRequest, GetSiteHeaderResponse } from "../../usecase-models/get-site-header-usecase-models";

/**
* Interface that represents a UseCase that will gather information from avilable gateways to help generate the site header.
*/
export interface GetSiteHeaderInputPort extends BaseInputPort<GetSiteHeaderRequest> {}

/**
* The interface defines a presenter that will generate a ViewModel used by the Site Header component.
*/
export interface GetSiteHeaderOutputPort extends BaseOutputPort<GetSiteHeaderResponse, GetSiteHeaderError> {}
12 changes: 0 additions & 12 deletions src/lib/core/port/primary/site-header-input-port.ts

This file was deleted.

10 changes: 0 additions & 10 deletions src/lib/core/port/primary/site-header-output-port.ts

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,18 +1,20 @@
import { injectable } from "inversify";
import { IronSession } from "iron-session";
import { SiteHeaderResponse } from "../usecase-models/site-header-usecase-models";
import { GetSiteHeaderError, GetSiteHeaderRequest, GetSiteHeaderResponse } from "../usecase-models/get-site-header-usecase-models";
import type { User } from "../entity/auth-models";
import SiteHeaderInputPort from "../port/primary/site-header-input-port";
import type SiteHeaderOutputPort from "../port/primary/site-header-output-port";
import type { GetSiteHeaderInputPort, GetSiteHeaderOutputPort } from "../port/primary/get-site-header-ports";
import type EnvConfigGatewayOutputPort from "../port/secondary/env-config-gateway-output-port";
import { BaseUseCase } from "@/lib/sdk/usecase";


@injectable()
class SiteHeaderUseCase implements SiteHeaderInputPort {
class GetSiteHeaderUseCase extends BaseUseCase<GetSiteHeaderRequest, GetSiteHeaderResponse, GetSiteHeaderError>implements GetSiteHeaderInputPort {

constructor(
private presenter: SiteHeaderOutputPort<any>,
private envConfigGateway: EnvConfigGatewayOutputPort,
protected readonly presenter: GetSiteHeaderOutputPort,
private readonly envConfigGateway: EnvConfigGatewayOutputPort,
) {
super(presenter);
this.presenter = presenter;
this.envConfigGateway = envConfigGateway;
}
Expand Down Expand Up @@ -58,7 +60,8 @@ class SiteHeaderUseCase implements SiteHeaderInputPort {

const homeUrl = `/dashboard`;

const baseResponseModel: SiteHeaderResponse = {
const baseResponseModel: GetSiteHeaderResponse = {
status: 'success',
homeUrl: homeUrl,
activeUser: activeUser,
availableUsers: allUsers,
Expand All @@ -68,21 +71,37 @@ class SiteHeaderUseCase implements SiteHeaderInputPort {
if(!activeUser){
await this.presenter.presentError({
...baseResponseModel,
error: 'no-active-user'
status: 'error',
error: 'no-active-user',
message: 'No active user found',
name: 'no-active-user',
code: 418,
})
return;
}

if(!projectURL) {
await this.presenter.presentError({
...baseResponseModel,
error: 'project-url-not-found'
status: 'error',
error: 'project-url-not-found',
message: 'Project URL not found',
name: 'project-url-not-found',
code: 500,
})
return;
}

await this.presenter.presentSuccess(baseResponseModel);
}

validateRequestModel(requestModel: GetSiteHeaderRequest): GetSiteHeaderError | undefined {
return undefined;
}

async execute(requestModel: GetSiteHeaderRequest): Promise<void> {
await this.generateSiteHeader(requestModel.session);
}
}

export default SiteHeaderUseCase;
export default GetSiteHeaderUseCase;
24 changes: 24 additions & 0 deletions src/lib/core/usecase-models/get-site-header-usecase-models.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { BaseErrorResponseModel, BaseResponseModel } from "@/lib/sdk/usecase-models"
import { IronSession } from "iron-session"
import { User } from "../entity/auth-models"


export interface GetSiteHeaderRequest {
session: IronSession
}

/**
* Response model for SiteHeaderUseCase {@link GetSiteHeaderUseCase}
* @property {string} homeUrl - URL of the home page (dashboard)
* @property {string} projectURL - URL of the experiment page
*/
export interface GetSiteHeaderResponse extends BaseResponseModel{
homeUrl: string
projectURL?: string
activeUser: User | undefined
availableUsers: User[]
}

export interface GetSiteHeaderError extends BaseErrorResponseModel, Omit<GetSiteHeaderResponse, 'status'> {
error: 'project-url-not-found' | 'no-active-user'
}
17 changes: 0 additions & 17 deletions src/lib/core/usecase-models/site-header-usecase-models.ts

This file was deleted.

32 changes: 19 additions & 13 deletions src/lib/infrastructure/controller/get-site-header-controller.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,31 @@
import SiteHeaderInputPort from "@/lib/core/port/primary/site-header-input-port";
import { GetSiteHeaderInputPort } from "@/lib/core/port/primary/get-site-header-ports";
import { GetSiteHeaderRequest } from "@/lib/core/usecase-models/get-site-header-usecase-models";
import { BaseController, TAuthenticatedControllerParameters, TSimpleControllerParameters } from "@/lib/sdk/controller";
import { inject, injectable } from "inversify";
import { IronSession } from "iron-session";
import { NextApiRequest, NextApiResponse } from "next";
import { NextApiResponse } from "next";
import USECASE_FACTORY from "../ioc/ioc-symbols-usecase-factory";

export interface IGetSiteHeaderController {
handle(session: IronSession, response: NextApiResponse): Promise<void>;

// Note: TAuthenticatedControllerParameters is NOT required, but is used to avoid type errors
// Yes, it is a hack
export type GetSiteHeaderControllerParameters = TSimpleControllerParameters & {
session: IronSession;
}

@injectable()
class GetSiteHeaderController implements IGetSiteHeaderController {
private useCase: SiteHeaderInputPort | null = null
private useCaseFactory: (response: NextApiResponse) => SiteHeaderInputPort
class GetSiteHeaderController extends BaseController<GetSiteHeaderControllerParameters, GetSiteHeaderRequest> {

constructor(
@inject(USECASE_FACTORY.SITE_HEADER) useCaseFactory: (response: NextApiResponse) => SiteHeaderInputPort,
){
this.useCaseFactory = useCaseFactory;
@inject(USECASE_FACTORY.GET_SITE_HEADER) getSiteHeaderUseCaseFactory: (response: NextApiResponse) => GetSiteHeaderInputPort,
) {
super(getSiteHeaderUseCaseFactory);
}
async handle(session: IronSession, response: NextApiResponse) {
this.useCase = this.useCaseFactory(response);
await this.useCase.generateSiteHeader(session)

prepareRequestModel(parameters: GetSiteHeaderControllerParameters): GetSiteHeaderRequest{
return {
session: parameters.session,
}
}
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { SessionUser, User } from "@/lib/core/entity/auth-models"
import { BaseViewModel } from "@/lib/sdk/view-models";

/**
* Represents the view model for the site header
Expand All @@ -7,9 +8,9 @@ import { SessionUser, User } from "@/lib/core/entity/auth-models"
* @property homeUrl - The URL to the home page or dashboard
* @property projectUrl - The URL to the project page corresponding to a VO, Experiment or Community which is configured via ENV variables
*/
export type SiteHeaderViewModel = {
export interface SiteHeaderViewModel extends BaseViewModel {
activeAccount?: User
availableAccounts?: User[]
homeUrl: string
projectUrl: string
projectUrl?: string
}
32 changes: 19 additions & 13 deletions src/lib/infrastructure/ioc/container-config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,10 +29,9 @@ import StreamUseCase from "@/lib/core/use-case/stream-usecase";
import { RSEOld } from "@/lib/core/entity/rucio";
import StreamingController, { IStreamingController } from "../controller/streaming-controller";
import StreamPresenter from "../presenter/stream-presenter";
import SiteHeaderInputPort from "@/lib/core/port/primary/site-header-input-port";
import SiteHeaderUseCase from "@/lib/core/use-case/site-header-usecase";
import GetSiteHeaderController, { IGetSiteHeaderController } from "../controller/get-site-header-controller";
import SiteHeaderPresenter from "../presenter/site-header-presenter";
import GetSiteHeaderUseCase from "@/lib/core/use-case/get-site-header-usecase";
import GetSiteHeaderController, { GetSiteHeaderControllerParameters } from "../controller/get-site-header-controller";
import GetSiteHeaderPresenter from "../presenter/get-site-header-presenter";
import SwitchAccountInputPort from "@/lib/core/port/primary/switch-account-input-port";
import SwitchAccountUseCase from "@/lib/core/use-case/switch-account-usecase";
import SwitchAccountController, { ISwitchAccountController } from "../controller/switch-account-controller";
Expand Down Expand Up @@ -60,6 +59,7 @@ import GetRSEProtocolsFeature from "./features/get-rse-protocols-feature";
import GetRSEAttributesFeature from "./features/get-rse-attributes-feature";
import ListRSEsFeature from "./features/list-rses-feature";
import ListAllRSEsFeature from "./features/list-all-rses-feature";
import GetSiteHeaderFeature from "./features/get-site-header-feature";


/**
Expand All @@ -75,6 +75,12 @@ appContainer.bind<StreamGatewayOutputPort>(GATEWAYS.STREAM).to(StreamingGateway)
appContainer.bind<SubscriptionGatewayOutputPort>(GATEWAYS.SUBSCRIPTION).to(SubscriptionGateway);
appContainer.bind<ReplicaGatewayOutputPort>(GATEWAYS.REPLICA).to(ReplicaGateway);


// Load Common Features
loadFeaturesSync(appContainer, [
new GetSiteHeaderFeature(appContainer),
])

// Load Auth Features/Usecases
loadFeaturesSync(appContainer, [
new LoginConfigFeature(appContainer),
Expand Down Expand Up @@ -141,15 +147,15 @@ appContainer.bind<interfaces.Factory<StreamInputPort<RSEOld>>>(USECASE_FACTORY.S
}
);

appContainer.bind<SiteHeaderInputPort>(INPUT_PORT.SITE_HEADER).to(SiteHeaderUseCase).inRequestScope();
appContainer.bind<IGetSiteHeaderController>(CONTROLLERS.SITE_HEADER).to(GetSiteHeaderController);
appContainer.bind<interfaces.Factory<SiteHeaderInputPort>>(USECASE_FACTORY.SITE_HEADER).toFactory<SiteHeaderUseCase, [NextApiResponse]>((context: interfaces.Context) =>
(response: NextApiResponse) => {
const envConfigGateway: EnvConfigGatewayOutputPort = appContainer.get(GATEWAYS.ENV_CONFIG)
const presenter = new SiteHeaderPresenter(response)
return new SiteHeaderUseCase(presenter, envConfigGateway);
}
);
// appContainer.bind<GetSiteHeaderInputPort>(INPUT_PORT.GET_SITE_HEADER).to(GetSiteHeaderUseCase).inRequestScope();
// appContainer.bind<GetSiteHeaderControllerParameters>(CONTROLLERS.GET_SITE_HEADER).to(GetSiteHeaderController);
// appContainer.bind<interfaces.Factory<GetSiteHeaderInputPort>>(USECASE_FACTORY.GET_SITE_HEADER).toFactory<GetSiteHeaderUseCase, [NextApiResponse]>((context: interfaces.Context) =>
// (response: NextApiResponse) => {
// const envConfigGateway: EnvConfigGatewayOutputPort = appContainer.get(GATEWAYS.ENV_CONFIG)
// const presenter = new GetSiteHeaderPresenter(response)
// return new GetSiteHeaderUseCase(presenter, envConfigGateway);
// }
// );

appContainer.bind<SwitchAccountInputPort>(INPUT_PORT.SWITCH_ACCOUNT).to(SwitchAccountUseCase).inRequestScope();
appContainer.bind<ISwitchAccountController>(CONTROLLERS.SWITCH_ACCOUNT).to(SwitchAccountController);
Expand Down
53 changes: 53 additions & 0 deletions src/lib/infrastructure/ioc/features/get-site-header-feature.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
import { GetSiteHeaderInputPort } from "@/lib/core/port/primary/get-site-header-ports";
import EnvConfigGatewayOutputPort from "@/lib/core/port/secondary/env-config-gateway-output-port";
import GetSiteHeaderUseCase from "@/lib/core/use-case/get-site-header-usecase";
import { BaseFeature } from "@/lib/sdk/ioc-helpers";
import { Container, interfaces } from "inversify";
import { NextApiResponse } from "next";
import GetSiteHeaderController, { GetSiteHeaderControllerParameters } from "../../controller/get-site-header-controller";
import GetSiteHeaderPresenter from "../../presenter/get-site-header-presenter";
import CONTROLLERS from "../ioc-symbols-controllers";
import GATEWAYS from "../ioc-symbols-gateway";
import INPUT_PORT from "../ioc-symbols-input-port";
import USECASE_FACTORY from "../ioc-symbols-usecase-factory";
import type {GetSiteHeaderRequest, GetSiteHeaderResponse, GetSiteHeaderError} from "@/lib/core/usecase-models/get-site-header-usecase-models";
import type {SiteHeaderViewModel} from "@/lib/infrastructure/data/view-model/site-header";

export default class GetSiteHeaderFeature extends BaseFeature<
GetSiteHeaderControllerParameters,
GetSiteHeaderRequest,
GetSiteHeaderResponse,
GetSiteHeaderError,
SiteHeaderViewModel>{
constructor(appContainer: Container) {
const envConfigGateway: EnvConfigGatewayOutputPort = appContainer.get(GATEWAYS.ENV_CONFIG)
const symbols = {
CONTROLLER: CONTROLLERS.GET_SITE_HEADER,
USECASE_FACTORY: USECASE_FACTORY.GET_SITE_HEADER,
INPUT_PORT: INPUT_PORT.GET_SITE_HEADER,
}
super(
'GetSiteHeader',
GetSiteHeaderController,
GetSiteHeaderUseCase,
[envConfigGateway],
GetSiteHeaderPresenter,
false,
symbols
)
}

/**
* Override the base implementation
*/
load(appContainer: Container) {
appContainer.bind<GetSiteHeaderInputPort>(INPUT_PORT.GET_SITE_HEADER).to(GetSiteHeaderUseCase).inRequestScope();
appContainer.bind<GetSiteHeaderController>(CONTROLLERS.GET_SITE_HEADER).to(GetSiteHeaderController);
appContainer.bind<interfaces.Factory<GetSiteHeaderInputPort>>(USECASE_FACTORY.GET_SITE_HEADER).toFactory<GetSiteHeaderUseCase, [NextApiResponse]>((context: interfaces.Context) =>
(response: NextApiResponse) => {
const envConfigGateway: EnvConfigGatewayOutputPort = appContainer.get(GATEWAYS.ENV_CONFIG)
const presenter = new GetSiteHeaderPresenter(response)
return new GetSiteHeaderUseCase(presenter, envConfigGateway);
});
}
}
2 changes: 1 addition & 1 deletion src/lib/infrastructure/ioc/ioc-symbols-controllers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ const CONTROLLERS = {
LIST_SUBSCRIPTIONS: Symbol.for("ListSubscriptionsController"),
LOGIN_CONFIG: Symbol.for("LoginConfigController"),
SET_X509_LOGIN_SESSION: Symbol.for("SetX509LoginSessionController"),
SITE_HEADER: Symbol.for("SiteHeaderController"),
GET_SITE_HEADER: Symbol.for("SiteHeaderController"),
STREAM: Symbol.for("StreamController"),
SWITCH_ACCOUNT: Symbol.for("SwitchAccountController"),
USERPASS_LOGIN: Symbol.for("UserPassLoginController"),
Expand Down
2 changes: 1 addition & 1 deletion src/lib/infrastructure/ioc/ioc-symbols-input-port.ts
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ const INPUT_PORT = {
LIST_SUBSCRIPTIONS: Symbol.for("ListSubscriptionsInputPort"),
LOGIN_CONFIG: Symbol.for("LoginConfigInputPort"),
SET_X509_LOGIN_SESSION: Symbol.for("SetX509LoginSessionInputPort"),
SITE_HEADER: Symbol.for("SiteHeaderInputPort"),
GET_SITE_HEADER: Symbol.for("SiteHeaderInputPort"),
STREAM: Symbol.for("StreamInputPort"),
SWITCH_ACCOUNT: Symbol.for("SwitchAccountInputPort"),
TEST: Symbol.for("TestInputPort"),
Expand Down
2 changes: 1 addition & 1 deletion src/lib/infrastructure/ioc/ioc-symbols-usecase-factory.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ const USECASE_FACTORY = {
LIST_SUBSCRIPTIONS: Symbol.for("Factory<ListSubscriptionsUseCase>"),
LOGIN_CONFIG: Symbol.for("Factory<LoginConfigUseCase>"),
SET_X509_LOGIN_SESSION: Symbol.for("Factory<SetX509LoginSessionUseCase>"),
SITE_HEADER: Symbol.for("Factory<SiteHeaderUseCase>"),
GET_SITE_HEADER: Symbol.for("Factory<SiteHeaderUseCase>"),
STREAM: Symbol.for("Factory<StreamUseCase>"),
SWITCH_ACCOUNT: Symbol.for("Factory<SwitchAccountUseCase>"),
USERPASS_LOGIN: Symbol.for("Factory<UserPassLoginUseCase>"),
Expand Down
Loading

0 comments on commit 615aca6

Please sign in to comment.