Skip to content

Commit

Permalink
allow overriding read endpoint types
Browse files Browse the repository at this point in the history
  • Loading branch information
SKairinos committed Aug 30, 2024
1 parent ab5edb5 commit 8af752a
Show file tree
Hide file tree
Showing 4 changed files with 50 additions and 42 deletions.
17 changes: 9 additions & 8 deletions src/api/endpoints/authFactor.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,23 +3,24 @@ import { type EndpointBuilder } from "@reduxjs/toolkit/query/react"
import {
buildUrl,
tagData,
type ListArg,
type ListResult,
type ListArg as _ListArg,
type ListResult as _ListResult,
} from "../../utils/api"
import type { AuthFactor } from "../models"
import { type TagTypes } from "../tagTypes"
import urls from "../urls"

export const AUTH_FACTOR_TAG: TagTypes = "AuthFactor"

export type ListAuthFactorsResult = ListResult<AuthFactor, "type">
export type ListAuthFactorsArg = ListArg
export type ListAuthFactorsResult = _ListResult<AuthFactor, "type">
export type ListAuthFactorsArg = _ListArg

export default function getReadAuthFactorEndpoints(
build: EndpointBuilder<any, any, any>,
) {
export default function getReadAuthFactorEndpoints<
ListResult extends _ListResult<AuthFactor> = ListAuthFactorsResult,
ListArg extends _ListArg<AuthFactor> = ListAuthFactorsArg,
>(build: EndpointBuilder<any, any, any>) {
return {
listAuthFactors: build.query<ListAuthFactorsResult, ListAuthFactorsArg>({
listAuthFactors: build.query<ListResult, ListArg>({
query: search => ({
url: buildUrl(urls.authFactor.list, { search }),
method: "GET",
Expand Down
29 changes: 16 additions & 13 deletions src/api/endpoints/klass.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,10 @@ import { type EndpointBuilder } from "@reduxjs/toolkit/query/react"
import {
buildUrl,
tagData,
type ListArg,
type ListResult,
type RetrieveArg,
type RetrieveResult,
type ListArg as _ListArg,
type ListResult as _ListResult,
type RetrieveArg as _RetrieveArg,
type RetrieveResult as _RetrieveResult,
} from "../../utils/api"
import type {
Class,
Expand All @@ -19,7 +19,7 @@ import urls from "../urls"

export const CLASS_TAG: TagTypes = "Class"

export type RetrieveClassResult = RetrieveResult<
export type RetrieveClassResult = _RetrieveResult<
Class,
"name" | "read_classmates_data" | "receive_requests_until" | "school"
> & {
Expand All @@ -36,9 +36,9 @@ export type RetrieveClassResult = RetrieveResult<
>
}
}
export type RetrieveClassArg = RetrieveArg<Class>
export type RetrieveClassArg = _RetrieveArg<Class>

export type ListClassesResult = ListResult<
export type ListClassesResult = _ListResult<
Class,
"name" | "read_classmates_data" | "receive_requests_until" | "school",
{
Expand All @@ -56,20 +56,23 @@ export type ListClassesResult = ListResult<
}
}
>
export type ListClassesArg = ListArg<{ teacher: Teacher["id"] }>
export type ListClassesArg = _ListArg<{ teacher: Teacher["id"] }>

export default function getReadClassEndpoints(
build: EndpointBuilder<any, any, any>,
) {
export default function getReadClassEndpoints<
RetrieveResult extends _RetrieveResult<Class> = RetrieveClassResult,
RetrieveArg extends _RetrieveArg<Class> = RetrieveClassArg,
ListResult extends _ListResult<Class> = ListClassesResult,
ListArg extends _ListArg<Class> = ListClassesArg,
>(build: EndpointBuilder<any, any, any>) {
return {
retrieveClass: build.query<RetrieveClassResult, RetrieveClassArg>({
retrieveClass: build.query<RetrieveResult, RetrieveArg>({
query: id => ({
url: buildUrl(urls.class.detail, { url: { id } }),
method: "GET",
}),
providesTags: tagData(CLASS_TAG),
}),
listClasses: build.query<ListClassesResult, ListClassesArg>({
listClasses: build.query<ListResult, ListArg>({
query: search => ({
url: buildUrl(urls.class.list, { search }),
method: "GET",
Expand Down
17 changes: 9 additions & 8 deletions src/api/endpoints/school.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,26 +3,27 @@ import { type EndpointBuilder } from "@reduxjs/toolkit/query/react"
import {
buildUrl,
tagData,
type RetrieveArg,
type RetrieveResult,
type RetrieveArg as _RetrieveArg,
type RetrieveResult as _RetrieveResult,
} from "../../utils/api"
import type { School } from "../models"
import { type TagTypes } from "../tagTypes"
import urls from "../urls"

export const SCHOOL_TAG: TagTypes = "School"

export type RetrieveSchoolResult = RetrieveResult<
export type RetrieveSchoolResult = _RetrieveResult<
School,
"name" | "country" | "uk_county"
>
export type RetrieveSchoolArg = RetrieveArg<School>
export type RetrieveSchoolArg = _RetrieveArg<School>

export default function getReadSchoolEndpoints(
build: EndpointBuilder<any, any, any>,
) {
export default function getReadSchoolEndpoints<
RetrieveResult extends _RetrieveResult<School> = RetrieveSchoolResult,
RetrieveArg extends _RetrieveArg<School> = RetrieveSchoolArg,
>(build: EndpointBuilder<any, any, any>) {
return {
retrieveSchool: build.query<RetrieveSchoolResult, RetrieveSchoolArg>({
retrieveSchool: build.query<RetrieveResult, RetrieveArg>({
query: id => ({
url: buildUrl(urls.school.detail, { url: { id } }),
method: "GET",
Expand Down
29 changes: 16 additions & 13 deletions src/api/endpoints/user.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,18 @@ import { type EndpointBuilder } from "@reduxjs/toolkit/query/react"
import {
buildUrl,
tagData,
type ListArg,
type ListResult,
type RetrieveArg,
type RetrieveResult,
type ListArg as _ListArg,
type ListResult as _ListResult,
type RetrieveArg as _RetrieveArg,
type RetrieveResult as _RetrieveResult,
} from "../../utils/api"
import type { Class, User } from "../models"
import { type TagTypes } from "../tagTypes"
import urls from "../urls"

export const USER_TAG: TagTypes = "User"

export type RetrieveUserResult = RetrieveResult<
export type RetrieveUserResult = _RetrieveResult<
User,
| "first_name"
| "last_name"
Expand All @@ -25,9 +25,9 @@ export type RetrieveUserResult = RetrieveResult<
| "student"
| "teacher"
>
export type RetrieveUserArg = RetrieveArg<User>
export type RetrieveUserArg = _RetrieveArg<User>

export type ListUsersResult = ListResult<
export type ListUsersResult = _ListResult<
User,
| "first_name"
| "last_name"
Expand All @@ -38,25 +38,28 @@ export type ListUsersResult = ListResult<
| "student"
| "teacher"
>
export type ListUsersArg = ListArg<{
export type ListUsersArg = _ListArg<{
students_in_class: Class["id"]
_id: User["id"] | User["id"][]
name: string
type: "teacher" | "student" | "independent" | "indy"
}>

export default function getReadUserEndpoints(
build: EndpointBuilder<any, any, any>,
) {
export default function getReadUserEndpoints<
RetrieveResult extends _RetrieveResult<User> = RetrieveUserResult,
RetrieveArg extends _RetrieveArg<User> = RetrieveUserArg,
ListResult extends _ListResult<User> = ListUsersResult,
ListArg extends _ListArg<User> = ListUsersArg,
>(build: EndpointBuilder<any, any, any>) {
return {
retrieveUser: build.query<RetrieveUserResult, RetrieveUserArg>({
retrieveUser: build.query<RetrieveResult, RetrieveArg>({
query: id => ({
url: buildUrl(urls.user.detail, { url: { id } }),
method: "GET",
}),
providesTags: tagData(USER_TAG),
}),
listUsers: build.query<ListUsersResult, ListUsersArg>({
listUsers: build.query<ListResult, ListArg>({
query: search => ({
url: buildUrl(urls.user.list, { search }),
method: "GET",
Expand Down

0 comments on commit 8af752a

Please sign in to comment.