Major update

This commit is contained in:
2023-06-01 08:52:05 -05:00
parent d7c0f373f4
commit df84287eb2
264 changed files with 8614 additions and 964 deletions

View File

@@ -12,6 +12,7 @@
"@nestjs/apollo": "^10.1.7",
"@nestjs/axios": "^1.0.1",
"@nestjs/common": "^9.0.0",
"@nestjs/config": "^2.3.1",
"@nestjs/core": "^9.0.0",
"@nestjs/platform-express": "^9.0.0",
"axios": "^1.3.1",
@@ -1920,6 +1921,22 @@
}
}
},
"node_modules/@nestjs/config": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.3.1.tgz",
"integrity": "sha512-Ckzel0NZ9CWhNsLfE1hxfDuxJuEbhQvGxSlmZ1/X8awjRmAA/g3kT6M1+MO1SHj1wMtPyUfd9WpwkiqFbiwQgA==",
"dependencies": {
"dotenv": "16.0.3",
"dotenv-expand": "10.0.0",
"lodash": "4.17.21",
"uuid": "9.0.0"
},
"peerDependencies": {
"@nestjs/common": "^7.0.0 || ^8.0.0 || ^9.0.0",
"reflect-metadata": "^0.1.13",
"rxjs": "^6.0.0 || ^7.2.0"
}
},
"node_modules/@nestjs/core": {
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.1.tgz",
@@ -4301,6 +4318,22 @@
"node": ">=6.0.0"
}
},
"node_modules/dotenv": {
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
"integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==",
"engines": {
"node": ">=12"
}
},
"node_modules/dotenv-expand": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz",
"integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A==",
"engines": {
"node": ">=12"
}
},
"node_modules/ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
@@ -11007,6 +11040,17 @@
"uid": "2.0.1"
}
},
"@nestjs/config": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/@nestjs/config/-/config-2.3.1.tgz",
"integrity": "sha512-Ckzel0NZ9CWhNsLfE1hxfDuxJuEbhQvGxSlmZ1/X8awjRmAA/g3kT6M1+MO1SHj1wMtPyUfd9WpwkiqFbiwQgA==",
"requires": {
"dotenv": "16.0.3",
"dotenv-expand": "10.0.0",
"lodash": "4.17.21",
"uuid": "9.0.0"
}
},
"@nestjs/core": {
"version": "9.3.1",
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-9.3.1.tgz",
@@ -12831,6 +12875,16 @@
"esutils": "^2.0.2"
}
},
"dotenv": {
"version": "16.0.3",
"resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.0.3.tgz",
"integrity": "sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ=="
},
"dotenv-expand": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-10.0.0.tgz",
"integrity": "sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A=="
},
"ee-first": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",

View File

@@ -23,6 +23,7 @@
"@nestjs/apollo": "^10.1.7",
"@nestjs/axios": "^1.0.1",
"@nestjs/common": "^9.0.0",
"@nestjs/config": "^2.3.1",
"@nestjs/core": "^9.0.0",
"@nestjs/platform-express": "^9.0.0",
"axios": "^1.3.1",

View File

@@ -1,17 +1,29 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { GraphQLModule } from '@nestjs/graphql';
import { TeamModule } from './teams/team.module';
import { VenueModule } from './venues/venue.module';
import { ApolloDriver, ApolloDriverConfig } from '@nestjs/apollo'
import { DivisionModule } from './divisions/division.module';
import { LeagueModule } from './leagues/league.module';
import { SportModule } from './sports/sport.module';
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
}),
GraphQLModule.forRoot<ApolloDriverConfig>({
typePaths: ['./**/*.graphql'],
driver: ApolloDriver
driver: ApolloDriver,
context: ({req, res}) => ({req, res}),
}),
TeamModule,
VenueModule,
DivisionModule,
LeagueModule,
SportModule,
],
})
export class AppModule {}

View File

@@ -0,0 +1,19 @@
type Division {
id: Int!
name: String!
season: Int!
nameShort: String!
link: String!
abbreviation: String!
leagueId: Int!
sportId: Int!
hasWildcard: String!
sortOrder: Int!
numPlayoffTeams: Int!
active: String!
}
type Query {
divisions(pageNumber: Int!, pageSize: Int!): [Division]
division(id: ID!): Division
}

View File

@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';
import { HttpModule } from '@nestjs/axios';
import { DivisionService } from './division.service';
import { DivisionResolver } from './division.resolver';
@Module({
imports: [HttpModule],
providers: [DivisionService, DivisionResolver]
})
export class DivisionModule {}

View File

@@ -0,0 +1,25 @@
import { Args, Context, Resolver, Query } from '@nestjs/graphql';
import { DivisionService } from './division.service';
import { Division } from '../graphql';
import { AxiosResponse } from 'axios';
@Resolver('Division')
export class DivisionResolver {
constructor (private readonly divisionService: DivisionService) {}
@Query()
async divisions(@Args('pageNumber') pageNumber: number, @Args('pageSize') pageSize: number, @Context() context): Promise<Division[]>{
const response: AxiosResponse = await this.divisionService.divisions(pageNumber, pageSize);
context.res.header('x-pagination', response.headers['x-pagination']);
return response.data;
}
@Query()
async division(@Args('id') id: number): Promise<Division> {
const response: AxiosResponse = await this.divisionService.division(id);
return response.data
}
}

View File

@@ -0,0 +1,17 @@
import { HttpService } from '@nestjs/axios';
import { Injectable } from '@nestjs/common';
import { Division } from 'src/graphql';
import { Axios, AxiosResponse } from 'axios';
@Injectable()
export class DivisionService {
constructor (private readonly httpService: HttpService) {}
async divisions(pageNumber: number, pageSize: number): Promise<AxiosResponse> {
return await this.httpService.axiosRef.get(`http://localhost:5500/api/divisions?pageNumber=${pageNumber}&pageSize=${pageSize}`);
}
async division(id: number): Promise<AxiosResponse> {
return await this.httpService.axiosRef.get(`http://localhost:5500/api/divisons/${id}`);
}
}

View File

@@ -8,6 +8,74 @@
/* tslint:disable */
/* eslint-disable */
export class Division {
id: number;
name: string;
season: number;
nameShort: string;
link: string;
abbreviation: string;
leagueId: number;
sportId: number;
hasWildcard: string;
sortOrder: number;
numPlayoffTeams: number;
active: string;
}
export abstract class IQuery {
abstract divisions(pageNumber: number, pageSize: number): Nullable<Nullable<Division>[]> | Promise<Nullable<Nullable<Division>[]>>;
abstract division(id: string): Nullable<Division> | Promise<Nullable<Division>>;
abstract leagues(pageNumber: number, pageSize: number): Nullable<Nullable<League>[]> | Promise<Nullable<Nullable<League>[]>>;
abstract league(id: string): Nullable<League> | Promise<Nullable<League>>;
abstract sports(pageNumber: number, pageSize: number): Nullable<Nullable<Sport>[]> | Promise<Nullable<Nullable<Sport>[]>>;
abstract sport(id: string): Nullable<Sport> | Promise<Nullable<Sport>>;
abstract teams(pageNumber: number, pageSize: number): Nullable<Nullable<Team>[]> | Promise<Nullable<Nullable<Team>[]>>;
abstract team(id: number): Nullable<Team> | Promise<Nullable<Team>>;
abstract venues(pageNumber: number, pageSize: number): Nullable<Nullable<Venue>[]> | Promise<Nullable<Nullable<Venue>[]>>;
abstract venue(id: number): Nullable<Venue> | Promise<Nullable<Venue>>;
}
export class League {
id: number;
name: string;
link: string;
abbreviation: string;
nameShort: string;
seasonState: string;
hasWildcard: string;
hasSplitSeason: string;
numGames: number;
hasPlayoffPoints: string;
numTeams: number;
numWildcardTeams: number;
orgCode: string;
conferenceInUse: string;
divisionsInUse: string;
sportId: number;
sortOrder: number;
active: string;
}
export class Sport {
id: string;
code: string;
link: string;
name: string;
abbreviation: string;
sortOrder: number;
activeStatus: string;
}
export class Team {
id?: Nullable<string>;
name?: Nullable<string>;
@@ -32,34 +100,6 @@ export class Team {
venueId?: Nullable<number>;
}
export class TeamsPagedResponse {
currentPage?: Nullable<number>;
errors?: Nullable<string>;
message?: Nullable<string>;
pageSize?: Nullable<number>;
results?: Nullable<Nullable<Team>[]>;
succeeded?: Nullable<boolean>;
totalItemCount?: Nullable<number>;
totalPageCount?: Nullable<number>;
}
export class TeamResponse {
errors?: Nullable<string>;
message?: Nullable<string>;
results: Team;
succeeded: boolean;
}
export abstract class IQuery {
abstract teams(pageNumber: number, pageSize: number): TeamsPagedResponse | Promise<TeamsPagedResponse>;
abstract teamById(id: number): TeamResponse | Promise<TeamResponse>;
abstract venues(pageNumber: number, pageSize: number): VenuesPagedResponse | Promise<VenuesPagedResponse>;
abstract venueById(id: number): VenueResponse | Promise<VenueResponse>;
}
export class Venue {
active: string;
id: number;
@@ -67,22 +107,4 @@ export class Venue {
name: string;
}
export class VenuesPagedResponse {
currentPage: number;
errors?: Nullable<string>;
message?: Nullable<string>;
pageSize: number;
results: Nullable<Venue>[];
succeeded: boolean;
totalItemCount: number;
totalPageCount: number;
}
export class VenueResponse {
errors?: Nullable<string>;
message?: Nullable<string>;
results: Venue;
succeeded: boolean;
}
type Nullable<T> = T | null;

View File

@@ -0,0 +1,25 @@
type League {
id: Int!
name: String!
link: String!
abbreviation: String!
nameShort: String!
seasonState: String!
hasWildcard: String!
hasSplitSeason: String!
numGames: Int!
hasPlayoffPoints: String!
numTeams: Int!
numWildcardTeams: Int!
orgCode: String!
conferenceInUse: String!
divisionsInUse: String!
sportId: Int!
sortOrder: Int!
active: String!
}
type Query {
leagues(pageNumber: Int!, pageSize: Int!): [League]
league(id: ID!): League
}

View File

@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';
import { HttpModule } from '@nestjs/axios';
import { LeagueResolver } from './league.resolver';
import { LeagueService } from './league.service';
@Module({
imports: [HttpModule],
providers: [LeagueResolver, LeagueService]
})
export class LeagueModule {}

View File

@@ -0,0 +1,25 @@
import { Args, Context, Resolver, Query } from "@nestjs/graphql";
import { LeagueService } from './league.service';
import { League } from '../graphql';
import { AxiosResponse } from 'axios';
@Resolver()
export class LeagueResolver {
constructor (private readonly leagueService: LeagueService) {}
@Query()
async leagues(@Args('pageNumber') pageNumber: number, @Args('pageSize') pageSize: number, @Context() context): Promise<League[]> {
const response: AxiosResponse = await this.leagueService.leagues(pageNumber, pageSize);
context.res.header('x-pagination', response.headers['x-pagination']);
return response.data;
}
@Query()
async league(@Args('id') id: number): Promise<League> {
const response: AxiosResponse = await this.leagueService.league(id);
return response.data;
}
}

View File

@@ -0,0 +1,16 @@
import { HttpService } from '@nestjs/axios';
import { Injectable } from '@nestjs/common';
import { AxiosResponse } from 'axios';
@Injectable()
export class LeagueService {
constructor (private readonly httpService: HttpService) {}
async leagues(pageNumber: number, pageSize: number): Promise<AxiosResponse> {
return await this.httpService.axiosRef.get(`http://localhost:5500/api/leagues?pageNumber=${pageNumber}&pageSize=${pageSize}`);
}
async league(id: number): Promise<AxiosResponse> {
return await this.httpService.axiosRef.get(`http://localhost:5500/api/leagues/${id}`);
}
}

View File

@@ -3,6 +3,12 @@ import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(8081);
app.use((req, res, next) => {
res.header('Access-Control-Expose-Headers', 'x-pagination');
next();
})
await app.listen(8080);
}
bootstrap();

View File

@@ -0,0 +1,14 @@
type Sport {
id: ID!
code: String!
link: String!
name: String!
abbreviation: String!
sortOrder: Int!
activeStatus: String!
}
type Query {
sports(pageNumber: Int!, pageSize: Int!): [Sport]
sport(id: ID!): Sport
}

View File

@@ -0,0 +1,10 @@
import { Module } from '@nestjs/common';
import { HttpModule } from '@nestjs/axios';
import { SportResolver } from './sport.resolver';
import { SportService } from './sport.service';
@Module({
imports: [HttpModule],
providers: [SportResolver, SportService]
})
export class SportModule {}

View File

@@ -0,0 +1,25 @@
import { Args, Context, Resolver, Query } from '@nestjs/graphql';
import { SportService } from './sport.service';
import { Sport } from '../graphql';
import { AxiosResponse } from 'axios';
@Resolver('Division')
export class SportResolver {
constructor (private readonly sportService: SportService) {}
@Query()
async sports(@Args('pageNumber') pageNumber: number, @Args('pageSize') pageSize: number, @Context() context): Promise<Sport[]> {
const response: AxiosResponse = await this.sportService.sports(pageNumber, pageSize);
context.res.header('x-pagination', response.headers['x-pagination'])
return response.data
}
@Query()
async sport(@Args('id') id: number): Promise<Sport> {
const response: AxiosResponse = await this.sportService.sport(id);
return response.data;
}
}

View File

@@ -0,0 +1,16 @@
import { HttpService } from "@nestjs/axios";
import { Injectable } from "@nestjs/common";
import { AxiosResponse } from 'axios';
@Injectable()
export class SportService {
constructor (private readonly httpService: HttpService) {}
async sports(pageNumber: number, pageSize: number): Promise<AxiosResponse> {
return await this.httpService.axiosRef.get(`http://localhost:5500/api/sports?pageNumber=${pageNumber}&pageSize=${pageSize}`);
}
async sport(id: number): Promise<AxiosResponse> {
return await this.httpService.axiosRef.get(`http//localhost:5500/api/sports/${id}`);
}
}

View File

@@ -22,33 +22,10 @@ type Team {
venueId: Int
}
type TeamsPagedResponse {
currentPage: Int
errors: String
message: String
pageSize: Int
results: [Team]
succeeded: Boolean
totalItemCount: Int
totalPageCount: Int
}
type TeamResponse {
errors: String
message: String
results: Team!
succeeded: Boolean!
}
type Query {
teams(
pageNumber: Int!
pageSize: Int!
): TeamsPagedResponse!
}
type Query {
teamById(
id: Int!
): TeamResponse!
): [Team]
team(id: Int!): Team
}

View File

@@ -1,18 +1,25 @@
import { Args, Resolver, Query } from '@nestjs/graphql';
import { Args, Context, Resolver, Query } from '@nestjs/graphql';
import { TeamService } from './team.service';
import { Team } from '../graphql';
import { AxiosResponse } from 'axios';
@Resolver('Team')
export class TeamResolvers {
constructor (private readonly teamService: TeamService) {}
@Query()
async teams(@Args('pageNumber') pageNumber: number, @Args('pageSize') pageSize: number): Promise<Team[]>{
return this.teamService.findAll(pageNumber, pageSize);
async teams(@Args('pageNumber') pageNumber: number, @Args('pageSize') pageSize: number, @Context() context): Promise<Team[]>{
const response: AxiosResponse = await this.teamService.teams(pageNumber, pageSize);
context.res.header('x-pagination', response.headers['x-pagination']);
return response.data
}
@Query()
async teamById(@Args('id') id: number): Promise<Team> {
return this.teamService.findById(id);
async team(@Args('id') id: number): Promise<Team> {
const response: AxiosResponse = await this.teamService.team(id);
return response.data
}
}

View File

@@ -1,23 +1,20 @@
import { HttpService } from '@nestjs/axios';
import { Injectable } from '@nestjs/common';
import { Team } from 'src/graphql';
import { AxiosResponse } from 'axios';
@Injectable()
export class TeamService {
constructor (private readonly httpService: HttpService) {}
private readonly teams: Team[] = [];
async teams(pageNumber: number, pageSize: number): Promise<AxiosResponse> {
const response: AxiosResponse = await this.httpService.axiosRef.get(`http://localhost:5500/api/teams?pageNumber=${pageNumber}&pageSize=${pageSize}`);
async findAll(pageNumber: number, pageSize: number): Promise<Team[]> {
const response: AxiosResponse = await this.httpService.axiosRef.get(`http://localhost:5520/api/teams?pageNumber=${pageNumber}&pageSize=${pageSize}`);
return response.data;
return response;
}
async findById(id: number): Promise<Team> {
const response: AxiosResponse = await this.httpService.axiosRef.get(`http://localhost:5520/api/teams/${id}`);
return response.data
async team(id: number): Promise<AxiosResponse> {
const response: AxiosResponse = await this.httpService.axiosRef.get(`http://localhost:5500/api/teams/${id}`);
return response
}
}

View File

@@ -1,37 +0,0 @@
type Venue {
active: String!
id: Int!
link: String!
name: String!
}
type VenuesPagedResponse {
currentPage: Int!
errors: String
message: String
pageSize: Int!
results: [Venue]!
succeeded: Boolean!
totalItemCount: Int!
totalPageCount: Int!
}
type VenueResponse {
errors: String
message: String
results: Venue!
succeeded: Boolean!
}
type Query {
venues(
pageNumber: Int!
pageSize: Int!
): VenuesPagedResponse!
}
type Query {
venueById(
id: Int!
): VenueResponse!
}

View File

@@ -0,0 +1,14 @@
type Venue {
active: String!
id: Int!
link: String!
name: String!
}
type Query {
venues(
pageNumber: Int!
pageSize: Int!
): [Venue]
venue(id: Int!): Venue
}

View File

@@ -1,18 +1,25 @@
import { Resolver, Query, Args } from "@nestjs/graphql";
import { Args, Context, Resolver, Query } from "@nestjs/graphql";
import { VenueService } from "./venue.service";
import { Venue } from '../graphql';
import { AxiosResponse } from 'axios';
@Resolver('Venue')
export class VenueResolvers {
constructor (private readonly venueService: VenueService) {}
@Query()
async venues(@Args('pageNumber') pageNumber: number, @Args('pageSize') pageSize: number): Promise<Venue[]> {
return this.venueService.findAll(pageNumber, pageSize);
async venues(@Args('pageNumber') pageNumber: number, @Args('pageSize') pageSize: number, @Context() context): Promise<Venue[]> {
const response: AxiosResponse = await this.venueService.venues(pageNumber, pageSize);
context.res.header('x-pagination', response.headers['x-pagination'])
return response.data
}
@Query()
async venueById(@Args('id') id: number): Promise<Venue> {
return this.venueService.findById(id);
async venue(@Args('id') id: number): Promise<Venue> {
const response: AxiosResponse = await this.venueService.venue(id);
return response.data;
}
}

View File

@@ -1,23 +1,20 @@
import { HttpService } from "@nestjs/axios";
import { Injectable } from "@nestjs/common";
import { Venue } from '../graphql';
import { AxiosResponse } from 'axios';
@Injectable()
export class VenueService {
constructor (private readonly httpService: HttpService) {}
private readonly venues: Venue[] = [];
async findAll(pageNumber: number, pageSize: number): Promise<Venue[]> {
const response: AxiosResponse = await this.httpService.axiosRef.get(`http://localhost:5510/api/venues?pageNumber=${pageNumber}&pageSize=${pageSize}`);
return response.data;
async venues(pageNumber: number, pageSize: number): Promise<AxiosResponse> {
const response: AxiosResponse = await this.httpService.axiosRef.get(`http://localhost:5500/api/venues?pageNumber=${pageNumber}&pageSize=${pageSize}`);
return response;
}
async findById(id: number): Promise<Venue> {
const response: AxiosResponse = await this.httpService.axiosRef.get(`http://localhost:5510/api/venues/${id}`);
async venue(id: number): Promise<AxiosResponse> {
const response: AxiosResponse = await this.httpService.axiosRef.get(`http://localhost:5500/api/venues/${id}`);
return response.data;
return response;
}
}