Skip to content
This repository has been archived by the owner on Aug 28, 2022. It is now read-only.

Commit

Permalink
feat: setup all the remaining field mapping
Browse files Browse the repository at this point in the history
  • Loading branch information
favna committed Jul 8, 2021
1 parent 55fd2da commit 7711261
Show file tree
Hide file tree
Showing 6 changed files with 260 additions and 29 deletions.
95 changes: 86 additions & 9 deletions src/services/PersonService.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
import FuzzyPersonArgs from '#arguments/FuzzyArgs/FuzzyPersonArgs';
import PersonArgs from '#arguments/PersonArgs';
import people from '#assets/people';
import FilmService from '#services/FilmService';
import PlanetService from '#services/PlanetService';
import SpeciesService from '#services/SpeciesService';
import StarshipService from '#services/StarshipService';
import VehicleService from '#services/VehicleService';
import type Film from '#structures/Film';
import Person from '#structures/Person';
import type Planet from '#structures/Planet';
import type Species from '#structures/Species';
import type Starship from '#structures/Starship';
import type Vehicle from '#structures/Vehicle';
import { addPropertyToClass } from '#utils/addPropertyToClass';
import FuzzySearch from '#utils/FuzzySearch';
import type GraphQLSet from '#utils/GraphQLSet';
Expand All @@ -11,29 +21,96 @@ import type Fuse from 'fuse.js';
import { Args } from 'type-graphql';

export default class PersonService {
private filmService: FilmService;
private planetService: PlanetService;
private speciesService: SpeciesService;
private starshipService: StarshipService;
private vehicleService: VehicleService;

public constructor() {
this.filmService = new FilmService();
this.planetService = new PlanetService();
this.speciesService = new SpeciesService();
this.starshipService = new StarshipService();
this.vehicleService = new VehicleService();
}

public getByPersonName(@Args(() => PersonArgs) { person }: PersonArgs): StarWarsApi.Person | undefined {
return people.get(person);
}

// TODO: add parameter to prevent deep-nesting
// TODO: ensure requestedFields supports deep-nesting
public mapPersonDataToPersonGraphQL(data: StarWarsApi.Person, requestedFields: GraphQLSet<keyof Person>, _isReferencedCall = false): Person {
// const film = new Film();
public mapPersonDataToPersonGraphQL(data: StarWarsApi.Person, requestedFields: GraphQLSet<keyof Person>, isReferencedCall = false): Person {
const person = new Person();

const films: Film[] = [];
const species: Species[] = [];
const starships: Starship[] = [];
const vehicles: Vehicle[] = [];

if (!isReferencedCall) {
if (requestedFields.has('films')) {
const filmFields = requestedFields.filterStartsWith<GraphQLSet<keyof Film>>('films.');

for (const film of data.films) {
const filmData = this.filmService.getByEpisodeNumber({ film })!;
films.push(this.filmService.mapFilmDataToFilmGraphQL(filmData, filmFields, true));
}
}

if (requestedFields.has('homeworld')) {
const homeworldFields = requestedFields.filterStartsWith<GraphQLSet<keyof Planet>>('homeworld.');

if (data.homeworld) {
const homeworldData = this.planetService.getByPlanetName({ planet: data.homeworld })!;
addPropertyToClass(
person,
'homeworld',
this.planetService.mapPlanetDataToPlanetGraphQL(homeworldData, homeworldFields, true),
requestedFields
);
}
}

if (requestedFields.has('species')) {
const speciesFields = requestedFields.filterStartsWith<GraphQLSet<keyof Species>>('species.');

for (const filmSpecies of data.species) {
const speciesData = this.speciesService.getBySpeciesName({ species: filmSpecies })!;
species.push(this.speciesService.mapSpeciesDataToSpeciesGraphQL(speciesData, speciesFields, true));
}
}

if (requestedFields.has('starships')) {
const starshipFields = requestedFields.filterStartsWith<GraphQLSet<keyof Starship>>('starships.');

for (const starship of data.starships) {
const starshipData = this.starshipService.getByStarshipName({ starship })!;
starships.push(this.starshipService.mapStarshipDataToStarshipGraphQL(starshipData, starshipFields, true));
}
}

if (requestedFields.has('vehicles')) {
const vehicleFields = requestedFields.filterStartsWith<GraphQLSet<keyof Vehicle>>('vehicles.');

for (const vehicle of data.vehicles) {
const vehicleData = this.vehicleService.getByVehicleName({ vehicle })!;
vehicles.push(this.vehicleService.mapVehicleDataToVehicleGraphQL(vehicleData, vehicleFields, true));
}
}
}

addPropertyToClass(person, 'birthYear', data.birthYear, requestedFields);
addPropertyToClass(person, 'eyeColors', data.eyeColors, requestedFields);
// addPropertyToClass(person, 'films', data.films, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(person, 'films', films, requestedFields);
addPropertyToClass(person, 'gender', data.gender, requestedFields);
addPropertyToClass(person, 'hairColors', data.hairColors, requestedFields);
addPropertyToClass(person, 'height', data.height, requestedFields);
addPropertyToClass(person, 'homeworld', data.homeworld, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(person, 'mass', data.mass, requestedFields);
addPropertyToClass(person, 'name', data.name, requestedFields);
addPropertyToClass(person, 'skinColors', data.skinColors, requestedFields);
addPropertyToClass(person, 'species', data.species, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(person, 'starships', data.starships, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(person, 'vehicles', data.vehicles, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(person, 'species', species, requestedFields);
addPropertyToClass(person, 'starships', starships, requestedFields);
addPropertyToClass(person, 'vehicles', vehicles, requestedFields);

return person;
}
Expand Down
43 changes: 38 additions & 5 deletions src/services/PlanetService.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import FuzzyPlanetArgs from '#arguments/FuzzyArgs/FuzzyPlanetArgs';
import PlanetArgs from '#arguments/PlanetArgs';
import planets from '#assets/planets';
import FilmService from '#services/FilmService';
import PersonService from '#services/PersonService';
import type Film from '#structures/Film';
import type Person from '#structures/Person';
import Planet from '#structures/Planet';
import { addPropertyToClass } from '#utils/addPropertyToClass';
import FuzzySearch from '#utils/FuzzySearch';
Expand All @@ -11,23 +15,52 @@ import type Fuse from 'fuse.js';
import { Args } from 'type-graphql';

export default class PlanetService {
private filmService: FilmService;
private personService: PersonService;

public constructor() {
this.filmService = new FilmService();
this.personService = new PersonService();
}

public getByPlanetName(@Args(() => PlanetArgs) { planet }: PlanetArgs): StarWarsApi.Planet | undefined {
return planets.get(planet);
}

// TODO: add parameter to prevent deep-nesting
// TODO: ensure requestedFields supports deep-nesting
public mapPlanetDataToPlanetGraphQL(data: StarWarsApi.Planet, requestedFields: GraphQLSet<keyof Planet>, _isReferencedCall = false): Planet {
public mapPlanetDataToPlanetGraphQL(data: StarWarsApi.Planet, requestedFields: GraphQLSet<keyof Planet>, isReferencedCall = false): Planet {
const planet = new Planet();

const films: Film[] = [];
const residents: Person[] = [];

if (!isReferencedCall) {
if (requestedFields.has('films')) {
const filmFields = requestedFields.filterStartsWith<GraphQLSet<keyof Film>>('films.');

for (const film of data.films) {
const filmData = this.filmService.getByEpisodeNumber({ film })!;
films.push(this.filmService.mapFilmDataToFilmGraphQL(filmData, filmFields, true));
}
}

if (requestedFields.has('residents')) {
const characterFields = requestedFields.filterStartsWith<GraphQLSet<keyof Person>>('residents.');

for (const character of data.residents) {
const personData = this.personService.getByPersonName({ person: character })!;
residents.push(this.personService.mapPersonDataToPersonGraphQL(personData, characterFields, true));
}
}
}

addPropertyToClass(planet, 'climates', data.climate, requestedFields);
addPropertyToClass(planet, 'diameter', data.diameter, requestedFields);
// addPropertyToClass(planet, 'films', data.films, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(planet, 'films', films, requestedFields);
addPropertyToClass(planet, 'gravity', data.gravity, requestedFields);
addPropertyToClass(planet, 'name', data.name, requestedFields);
addPropertyToClass(planet, 'orbitalPeriod', data.orbitalPeriod, requestedFields);
addPropertyToClass(planet, 'population', data.population, requestedFields);
addPropertyToClass(planet, 'residents', data.residents, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(planet, 'residents', residents, requestedFields);
addPropertyToClass(planet, 'rotationPeriod', data.rotationPeriod, requestedFields);
addPropertyToClass(planet, 'surfaceWater', data.surfaceWater, requestedFields);
addPropertyToClass(planet, 'terrains', data.terrains, requestedFields);
Expand Down
62 changes: 56 additions & 6 deletions src/services/SpeciesService.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,12 @@
import FuzzySpeciesArgs from '#arguments/FuzzyArgs/FuzzySpeciesArgs';
import SpeciesArgs from '#arguments/SpeciesArgs';
import speciesData from '#assets/species';
import FilmService from '#services/FilmService';
import PersonService from '#services/PersonService';
import PlanetService from '#services/PlanetService';
import type Film from '#structures/Film';
import type Person from '#structures/Person';
import type Planet from '#structures/Planet';
import Species from '#structures/Species';
import { addPropertyToClass } from '#utils/addPropertyToClass';
import FuzzySearch from '#utils/FuzzySearch';
Expand All @@ -11,26 +17,70 @@ import type Fuse from 'fuse.js';
import { Args } from 'type-graphql';

export default class SpeciesService {
private filmService: FilmService;
private personService: PersonService;
private planetService: PlanetService;

public constructor() {
this.filmService = new FilmService();
this.personService = new PersonService();
this.planetService = new PlanetService();
}

public getBySpeciesName(@Args(() => SpeciesArgs) { species }: SpeciesArgs): StarWarsApi.Species | undefined {
return speciesData.get(species);
}

// TODO: add parameter to prevent deep-nesting
// TODO: ensure requestedFields supports deep-nesting
public mapSpeciesDataToSpeciesGraphQL(data: StarWarsApi.Species, requestedFields: GraphQLSet<keyof Species>, _isReferencedCall = false): Species {
public mapSpeciesDataToSpeciesGraphQL(data: StarWarsApi.Species, requestedFields: GraphQLSet<keyof Species>, isReferencedCall = false): Species {
const species = new Species();

const people: Person[] = [];
const films: Film[] = [];

if (!isReferencedCall) {
if (requestedFields.has('films')) {
const filmFields = requestedFields.filterStartsWith<GraphQLSet<keyof Film>>('films.');

for (const film of data.films) {
const filmData = this.filmService.getByEpisodeNumber({ film })!;
films.push(this.filmService.mapFilmDataToFilmGraphQL(filmData, filmFields, true));
}
}

if (requestedFields.has('people')) {
const characterFields = requestedFields.filterStartsWith<GraphQLSet<keyof Person>>('people.');

for (const character of data.people) {
const personData = this.personService.getByPersonName({ person: character })!;
people.push(this.personService.mapPersonDataToPersonGraphQL(personData, characterFields, true));
}
}

if (requestedFields.has('homeworld')) {
const homeworldFields = requestedFields.filterStartsWith<GraphQLSet<keyof Planet>>('homeworld.');

if (data.homeworld) {
const homeworldData = this.planetService.getByPlanetName({ planet: data.homeworld })!;
addPropertyToClass(
species,
'homeworld',
this.planetService.mapPlanetDataToPlanetGraphQL(homeworldData, homeworldFields, true),
requestedFields
);
}
}
}

addPropertyToClass(species, 'averageHeight', data.averageHeight, requestedFields);
addPropertyToClass(species, 'averageLifespan', data.averageLifespan, requestedFields);
addPropertyToClass(species, 'classification', data.classification, requestedFields);
addPropertyToClass(species, 'designation', data.designation, requestedFields);
addPropertyToClass(species, 'eyeColors', data.eyeColors, requestedFields);
// addPropertyToClass(species, 'films', data.films, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(species, 'films', films, requestedFields);
addPropertyToClass(species, 'hairColors', data.hairColors, requestedFields);
addPropertyToClass(species, 'homeworld', data.homeworld, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(species, 'language', data.language, requestedFields);
addPropertyToClass(species, 'name', data.name, requestedFields);
addPropertyToClass(species, 'people', data.people, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(species, 'people', people, requestedFields);
addPropertyToClass(species, 'skinColors', data.skinColors, requestedFields);

return species;
Expand Down
43 changes: 38 additions & 5 deletions src/services/StarshipService.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,10 @@
import FuzzyStarshipArgs from '#arguments/FuzzyArgs/FuzzyStarshipArgs';
import StarshipArgs from '#arguments/StarshipArgs';
import starships from '#assets/starships';
import FilmService from '#services/FilmService';
import PersonService from '#services/PersonService';
import type Film from '#structures/Film';
import type Person from '#structures/Person';
import Starship from '#structures/Starship';
import { addPropertyToClass } from '#utils/addPropertyToClass';
import FuzzySearch from '#utils/FuzzySearch';
Expand All @@ -11,24 +15,53 @@ import type Fuse from 'fuse.js';
import { Args } from 'type-graphql';

export default class StarshipService {
private filmService: FilmService;
private personService: PersonService;

public constructor() {
this.filmService = new FilmService();
this.personService = new PersonService();
}

public getByStarshipName(@Args(() => StarshipArgs) { starship }: StarshipArgs): StarWarsApi.Starship | undefined {
return starships.get(starship);
}

// TODO: add parameter to prevent deep-nesting
// TODO: ensure requestedFields supports deep-nesting
public mapStarshipDataToStarshipGraphQL(
data: StarWarsApi.Starship,
requestedFields: GraphQLSet<keyof Starship>,
_isReferencedCall = false
isReferencedCall = false
): Starship {
const starship = new Starship();

const pilots: Person[] = [];
const films: Film[] = [];

if (!isReferencedCall) {
if (requestedFields.has('films')) {
const filmFields = requestedFields.filterStartsWith<GraphQLSet<keyof Film>>('films.');

for (const film of data.films) {
const filmData = this.filmService.getByEpisodeNumber({ film })!;
films.push(this.filmService.mapFilmDataToFilmGraphQL(filmData, filmFields, true));
}
}

if (requestedFields.has('pilots')) {
const characterFields = requestedFields.filterStartsWith<GraphQLSet<keyof Person>>('pilots.');

for (const character of data.pilots) {
const personData = this.personService.getByPersonName({ person: character })!;
pilots.push(this.personService.mapPersonDataToPersonGraphQL(personData, characterFields, true));
}
}
}

addPropertyToClass(starship, 'cargoCapacity', data.cargoCapacity, requestedFields);
addPropertyToClass(starship, 'consumables', data.consumables, requestedFields);
addPropertyToClass(starship, 'costInCredits', data.costInCredits, requestedFields);
addPropertyToClass(starship, 'crew', data.crew, requestedFields);
// addPropertyToClass(starship, 'films', data.films, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(starship, 'films', films, requestedFields);
addPropertyToClass(starship, 'hyperdriveRating', data.hyperdriveRating, requestedFields);
addPropertyToClass(starship, 'length', data.length, requestedFields);
addPropertyToClass(starship, 'manufacturers', data.manufacturers, requestedFields);
Expand All @@ -37,7 +70,7 @@ export default class StarshipService {
addPropertyToClass(starship, 'model', data.model, requestedFields);
addPropertyToClass(starship, 'name', data.name, requestedFields);
addPropertyToClass(starship, 'passengers', data.passengers, requestedFields);
addPropertyToClass(starship, 'pilots', data.pilots, requestedFields); // TODO: map to actual GraphQL Class
addPropertyToClass(starship, 'pilots', pilots, requestedFields);
addPropertyToClass(starship, 'starshipClass', data.starshipClass, requestedFields);

return starship;
Expand Down
Loading

0 comments on commit 7711261

Please sign in to comment.