Skip to content

Commit

Permalink
feat(core): rewardable items (#376)
Browse files Browse the repository at this point in the history
  • Loading branch information
haydencleary authored Oct 11, 2024
1 parent e708c51 commit 2a9e051
Show file tree
Hide file tree
Showing 13 changed files with 547 additions and 9 deletions.
5 changes: 5 additions & 0 deletions core/application/react-query-adapter/reward/client/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,3 +2,8 @@ export * from "./use-get-project-rewards";
export * from "./use-get-project-reward";
export * from "./use-get-project-reward-items";
export * from "./use-create-rewards";
export * from "./use-get-project-rewardable-items";
export * from "./use-get-all-completed-project-rewardable-items";
export * from "./use-add-other-work";
export * from "./use-add-other-pull-request";
export * from "./use-add-other-issue";
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { useMutation, useQueryClient } from "@tanstack/react-query";

import {
UseMutationFacadeParams,
useMutationAdapter,
} from "@/core/application/react-query-adapter/helpers/use-mutation-adapter";
import { bootstrap } from "@/core/bootstrap";
import { RewardFacadePort } from "@/core/domain/reward/input/reward-facade-port";
import { AddOtherIssueBody, AddOtherIssueModel } from "@/core/domain/reward/reward-contract.types";

export function useAddOtherIssue({
pathParams,
options,
}: UseMutationFacadeParams<RewardFacadePort["addOtherIssue"], undefined, AddOtherIssueModel, AddOtherIssueBody> = {}) {
const rewardStoragePort = bootstrap.getRewardStoragePortForClient();
const queryClient = useQueryClient();

return useMutation(
useMutationAdapter({
...rewardStoragePort.addOtherIssue({ pathParams }),
options: {
...options,
onSuccess: async (data, variables, context) => {
if (pathParams?.projectId) {
await queryClient.invalidateQueries({
queryKey: rewardStoragePort.getProjectRewardableItems({ pathParams: { projectId: pathParams.projectId } })
.tag,
exact: false,
});

await queryClient.invalidateQueries({
queryKey: rewardStoragePort.getAllCompletedProjectRewardableItems({
pathParams: { projectId: pathParams.projectId },
}).tag,
exact: false,
});
}

options?.onSuccess?.(data, variables, context);
},
},
})
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
import { useMutation, useQueryClient } from "@tanstack/react-query";

import {
UseMutationFacadeParams,
useMutationAdapter,
} from "@/core/application/react-query-adapter/helpers/use-mutation-adapter";
import { bootstrap } from "@/core/bootstrap";
import { RewardFacadePort } from "@/core/domain/reward/input/reward-facade-port";
import { AddOtherPullRequestBody, AddOtherPullRequestModel } from "@/core/domain/reward/reward-contract.types";

export function useAddOtherPullRequest({
pathParams,
options,
}: UseMutationFacadeParams<
RewardFacadePort["addOtherPullRequest"],
undefined,
AddOtherPullRequestModel,
AddOtherPullRequestBody
> = {}) {
const rewardStoragePort = bootstrap.getRewardStoragePortForClient();
const queryClient = useQueryClient();

return useMutation(
useMutationAdapter({
...rewardStoragePort.addOtherPullRequest({ pathParams }),
options: {
...options,
onSuccess: async (data, variables, context) => {
if (pathParams?.projectId) {
await queryClient.invalidateQueries({
queryKey: rewardStoragePort.getProjectRewardableItems({ pathParams: { projectId: pathParams.projectId } })
.tag,
exact: false,
});

await queryClient.invalidateQueries({
queryKey: rewardStoragePort.getAllCompletedProjectRewardableItems({
pathParams: { projectId: pathParams.projectId },
}).tag,
exact: false,
});
}

options?.onSuccess?.(data, variables, context);
},
},
})
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
import { useMutation, useQueryClient } from "@tanstack/react-query";

import {
UseMutationFacadeParams,
useMutationAdapter,
} from "@/core/application/react-query-adapter/helpers/use-mutation-adapter";
import { bootstrap } from "@/core/bootstrap";
import { RewardFacadePort } from "@/core/domain/reward/input/reward-facade-port";
import { AddOtherWorkBody, AddOtherWorkModel } from "@/core/domain/reward/reward-contract.types";

export function useAddOtherWork({
pathParams,
options,
}: UseMutationFacadeParams<RewardFacadePort["addOtherWork"], undefined, AddOtherWorkModel, AddOtherWorkBody> = {}) {
const rewardStoragePort = bootstrap.getRewardStoragePortForClient();
const queryClient = useQueryClient();

return useMutation(
useMutationAdapter({
...rewardStoragePort.addOtherWork({ pathParams }),
options: {
...options,
onSuccess: async (data, variables, context) => {
if (pathParams?.projectId) {
await queryClient.invalidateQueries({
queryKey: rewardStoragePort.getProjectRewardableItems({ pathParams: { projectId: pathParams.projectId } })
.tag,
exact: false,
});

await queryClient.invalidateQueries({
queryKey: rewardStoragePort.getAllCompletedProjectRewardableItems({
pathParams: { projectId: pathParams.projectId },
}).tag,
exact: false,
});
}

options?.onSuccess?.(data, variables, context);
},
},
})
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,19 @@ import {
} from "@/core/application/react-query-adapter/helpers/use-mutation-adapter";
import { bootstrap } from "@/core/bootstrap";
import { RewardFacadePort } from "@/core/domain/reward/input/reward-facade-port";
import { CreateRewardsBody } from "@/core/domain/reward/reward-contract.types";
import { CreateRewardsBody, CreateRewardsResponse } from "@/core/domain/reward/reward-contract.types";

export function useCreateRewards({
pathParams,
options,
}: UseMutationFacadeParams<RewardFacadePort["createRewards"], undefined, never, CreateRewardsBody> = {}) {
}: UseMutationFacadeParams<
RewardFacadePort["createRewards"],
undefined,
CreateRewardsResponse,
CreateRewardsBody
> = {}) {
const rewardStoragePort = bootstrap.getRewardStoragePortForClient();
const meStoragePort = bootstrap.getMeStoragePortForClient();
const queryClient = useQueryClient();

return useMutation(
Expand All @@ -26,8 +32,26 @@ export function useCreateRewards({
queryKey: rewardStoragePort.getProjectRewards({ pathParams: { projectId: pathParams.projectId } }).tag,
exact: false,
});

await queryClient.invalidateQueries({
queryKey: rewardStoragePort.getProjectRewardableItems({ pathParams: { projectId: pathParams.projectId } })
.tag,
exact: false,
});

await queryClient.invalidateQueries({
queryKey: rewardStoragePort.getAllCompletedProjectRewardableItems({
pathParams: { projectId: pathParams.projectId },
}).tag,
exact: false,
});
}

await queryClient.invalidateQueries({
queryKey: meStoragePort.getMe({}).tag,
exact: false,
});

options?.onSuccess?.(data, variables, context);
},
},
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { useQuery } from "@tanstack/react-query";

import {
UseQueryFacadeParams,
useQueryAdapter,
} from "@/core/application/react-query-adapter/helpers/use-query-adapter";
import { bootstrap } from "@/core/bootstrap";
import { RewardFacadePort } from "@/core/domain/reward/input/reward-facade-port";
import { GetAllCompletedProjectRewardableItemsModel } from "@/core/domain/reward/reward-contract.types";

export function useGetAllCompletedProjectRewardableItems({
options,
pathParams,
queryParams,
}: UseQueryFacadeParams<
RewardFacadePort["getAllCompletedProjectRewardableItems"],
GetAllCompletedProjectRewardableItemsModel
>) {
const rewardStoragePort = bootstrap.getRewardStoragePortForClient();

return useQuery(
useQueryAdapter({
...rewardStoragePort.getAllCompletedProjectRewardableItems({ pathParams, queryParams }),
options,
})
);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { useInfiniteQuery } from "@tanstack/react-query";

import {
UseInfiniteQueryFacadeParams,
useInfiniteQueryAdapter,
} from "@/core/application/react-query-adapter/helpers/use-infinite-query-adapter";
import { bootstrap } from "@/core/bootstrap";
import { RewardFacadePort } from "@/core/domain/reward/input/reward-facade-port";
import { GetProjectRewardableItemsModel } from "@/core/domain/reward/reward-contract.types";

export function useGetProjectRewardableItems({
pathParams,
queryParams,
options,
}: UseInfiniteQueryFacadeParams<RewardFacadePort["getProjectRewardableItems"], GetProjectRewardableItemsModel>) {
const rewardStoragePort = bootstrap.getRewardStoragePortForClient();

return useInfiniteQuery(
useInfiniteQueryAdapter<RewardFacadePort["getProjectRewardableItems"], GetProjectRewardableItemsModel>({
pathParams,
queryParams,
options,
httpStorage: rewardStoragePort.getProjectRewardableItems,
})
);
}
17 changes: 17 additions & 0 deletions core/domain/reward/input/reward-facade-port.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
import {
AddOtherIssuePortParams,
AddOtherIssuePortResponse,
AddOtherPullRequestPortParams,
AddOtherPullRequestPortResponse,
AddOtherWorkPortParams,
AddOtherWorkPortResponse,
CreateRewardsPortParams,
CreateRewardsPortResponse,
GetAllCompletedProjectRewardableItemsPortParams,
GetAllCompletedProjectRewardableItemsPortResponse,
GetProjectRewardItemsPortParams,
GetProjectRewardItemsPortResponse,
GetProjectRewardPortParams,
GetProjectRewardPortResponse,
GetProjectRewardableItemsPortParams,
GetProjectRewardableItemsPortResponse,
GetProjectRewardsPortParams,
GetProjectRewardsPortResponse,
} from "@/core/domain/reward/reward-contract.types";
Expand All @@ -14,4 +24,11 @@ export interface RewardFacadePort {
getProjectReward(p: GetProjectRewardPortParams): GetProjectRewardPortResponse;
getProjectRewardItems(p: GetProjectRewardItemsPortParams): GetProjectRewardItemsPortResponse;
createRewards(p: CreateRewardsPortParams): CreateRewardsPortResponse;
getProjectRewardableItems(p: GetProjectRewardableItemsPortParams): GetProjectRewardableItemsPortResponse;
getAllCompletedProjectRewardableItems(
p: GetAllCompletedProjectRewardableItemsPortParams
): GetAllCompletedProjectRewardableItemsPortResponse;
addOtherWork(p: AddOtherWorkPortParams): AddOtherWorkPortResponse;
addOtherPullRequest(p: AddOtherPullRequestPortParams): AddOtherPullRequestPortResponse;
addOtherIssue(p: AddOtherIssuePortParams): AddOtherIssuePortResponse;
}
29 changes: 29 additions & 0 deletions core/domain/reward/models/rewardable-item-model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
import { components } from "@/core/infrastructure/marketplace-api-client-adapter/__generated/api";

export type RewardableItemResponse = components["schemas"]["RewardableItemResponse"];

export interface RewardableItemInterface extends RewardableItemResponse {}

export class RewardableItem implements RewardableItemInterface {
author!: RewardableItemResponse["author"];
commentsCount!: RewardableItemResponse["commentsCount"];
commitsCount!: RewardableItemResponse["commitsCount"];
completedAt!: RewardableItemResponse["completedAt"];
contributionId!: RewardableItemResponse["contributionId"];
createdAt!: RewardableItemResponse["createdAt"];
githubBody!: RewardableItemResponse["githubBody"];
htmlUrl!: RewardableItemResponse["htmlUrl"];
id!: RewardableItemResponse["id"];
ignored!: RewardableItemResponse["ignored"];
number!: RewardableItemResponse["number"];
repoId!: RewardableItemResponse["repoId"];
repoName!: RewardableItemResponse["repoName"];
status!: RewardableItemResponse["status"];
title!: RewardableItemResponse["title"];
type!: RewardableItemResponse["type"];
userCommitsCount!: RewardableItemResponse["userCommitsCount"];

constructor(props: RewardableItemResponse) {
Object.assign(this, props);
}
}
17 changes: 17 additions & 0 deletions core/domain/reward/outputs/reward-storage-port.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
import {
AddOtherIssuePortParams,
AddOtherIssuePortResponse,
AddOtherPullRequestPortParams,
AddOtherPullRequestPortResponse,
AddOtherWorkPortParams,
AddOtherWorkPortResponse,
CreateRewardsPortParams,
CreateRewardsPortResponse,
GetAllCompletedProjectRewardableItemsPortParams,
GetAllCompletedProjectRewardableItemsPortResponse,
GetProjectRewardItemsPortParams,
GetProjectRewardItemsPortResponse,
GetProjectRewardPortParams,
GetProjectRewardPortResponse,
GetProjectRewardableItemsPortParams,
GetProjectRewardableItemsPortResponse,
GetProjectRewardsPortParams,
GetProjectRewardsPortResponse,
} from "@/core/domain/reward/reward-contract.types";
Expand All @@ -15,4 +25,11 @@ export interface RewardStoragePort {
getProjectReward(p: GetProjectRewardPortParams): GetProjectRewardPortResponse;
getProjectRewardItems(p: GetProjectRewardItemsPortParams): GetProjectRewardItemsPortResponse;
createRewards(p: CreateRewardsPortParams): CreateRewardsPortResponse;
getProjectRewardableItems(p: GetProjectRewardableItemsPortParams): GetProjectRewardableItemsPortResponse;
getAllCompletedProjectRewardableItems(
p: GetAllCompletedProjectRewardableItemsPortParams
): GetAllCompletedProjectRewardableItemsPortResponse;
addOtherWork(p: AddOtherWorkPortParams): AddOtherWorkPortResponse;
addOtherPullRequest(p: AddOtherPullRequestPortParams): AddOtherPullRequestPortResponse;
addOtherIssue(p: AddOtherIssuePortParams): AddOtherIssuePortResponse;
}
Loading

0 comments on commit 2a9e051

Please sign in to comment.