Skip to content

12 People Types

JP Barbosa edited this page Apr 15, 2023 · 2 revisions

People Types

People Types

code ./packages/shared/src/types/People.ts
import { Integer, Node, Relationship } from 'neo4j-driver';
import { Movie } from './Movie';

export type PersonMovie = Movie & {
  relationship: string;
};

export type Person = {
  id?: number;
  name: string;
  born?: number;
  movies?: PersonMovie[];
};

export type ActedIn = {
  roles: string[];
};

export type Actor = Person & ActedIn;

export type Director = Person;

export type Producer = Person;

export type Writer = Person;

export type Reviewer = Person;

export type PersonNode = Node<Integer, Person>;

export type ActedInRelationship = Relationship<Integer, ActedIn>;

export type PeopleQueryResult = {
  person: Person;
};
code ./packages/shared/src/types/Movie.ts
...
import { Actor, Director, Producer, Reviewer, Writer } from './People';

export type MoviePerson = Actor | Director | Producer | Reviewer | Writer;

export type Movie = {
  ...
  people: {
    actors: Actor[];
    directors: Director[];
    producers: Producer[];
    writers: Writer[];
    reviewers: Reviewer[];
  };
};

...
code ./packages/shared/src/types/relationships.ts
export type RelationshipKey =
  | 'ACTED_IN'
  | 'DIRECTED'
  | 'PRODUCED'
  | 'WROTE'
  | 'REVIEWED';

export type RelationshipCollection =
  | 'actors'
  | 'directors'
  | 'producers'
  | 'writers'
  | 'reviewers';

export type Relationship = {
  key: RelationshipKey;
  collection: RelationshipCollection;
};

export const relationships: Relationship[] = [
  {
    key: 'ACTED_IN',
    collection: 'actors',
  },
  {
    key: 'DIRECTED',
    collection: 'directors',
  },
  {
    key: 'PRODUCED',
    collection: 'producers',
  },
  {
    key: 'WROTE',
    collection: 'writers',
  },
  {
    key: 'REVIEWED',
    collection: 'reviewers',
  },
];

export const relationshipKeys: RelationshipKey[] = relationships.map(
  (relationship) => relationship.key
);

export const relationshipCollections: RelationshipCollection[] =
  relationships.map((relationship) => relationship.collection);
code ./packages/shared/src/types/index.ts
...
export * from './People';
export * from './relationships';

Create People Sample

code ./packages/shared/src/sampleData/people.ts
import { Person } from '../types';

export const people: Person[] = [
  {
    id: 1,
    name: 'Keanu Reeves',
    born: 1964,
  },
];
code ./packages/shared/src/sampleData/index.ts
...
export * from './people';

Update Movies Sample

code ./packages/shared/src/sampleData/movies.ts
import { Movie } from '../types/Movie';

export const movies: Movie[] = [
  {
    id: 1,
    title: 'The Shawshank Redemption',
    released: 1994,
    tagline: 'Fear can hold you prisoner. Hope can set you free.',
    people: {
      actors: [
        {
          name: 'Tim Robbins',
          born: 1958,
          roles: ['Andy Dufresne'],
        },
        {
          name: 'Morgan Freeman',
          born: 1937,
          roles: ['Ellis Boyd "Red" Redding'],
        },
      ],
      directors: [],
      producers: [],
      writers: [],
      reviewers: [],
    },
  },
  {
    id: 2,
    title: 'The Godfather',
    released: 1972,
    tagline: "An offer you can't refuse.",
    people: {
      actors: [
        {
          name: 'Marlon Brando',
          born: 1924,
          roles: ['Don Vito Corleone'],
        },
        {
          name: 'Al Pacino',
          born: 1940,
          roles: ['Michael Corleone'],
        },
      ],
      directors: [],
      producers: [],
      writers: [],
      reviewers: [],
    },
  },
];

Utils

code ./packages/shared/src/utils/stringToTitleCase.ts
export const stringToTitleCase = (txt: string) => {
  return txt.replace(/_/g, ' ').replace(/\w\S*/g, (txt: string) => {
    return txt.charAt(0).toUpperCase() + txt.substr(1).toLowerCase();
  });
};
code ./packages/shared/src/index.ts
export * from './utils/stringToTitleCase';

Commit

git add .
git commit -m "People Types"

Next step: People Graph