chore(release): 0.1.1
[risinglegends.git] / seeds / cities.ts
1 import { config as dotenv } from 'dotenv';
2 import { db } from "../src/server/lib/db";
3 import Airtable from 'airtable';
4
5 dotenv();
6
7 const CITIES_TABLE = 'tblNB3vyd4XXGO1uh';
8
9 let stats = {
10   cityCount: 0,
11   paths: 0
12 };
13
14 Airtable.configure({
15   apiKey: process.env.AIRTABLE_API_KEY
16 });
17
18 const base = Airtable.base('appDfPLPajPNog5Iw');
19
20 export async function createCities(): Promise<void> {
21   return new Promise(async (resolve) => {
22
23     base(CITIES_TABLE).select({
24       fields: ['id', 'Name'],
25       sort: [{field: 'id', 'direction': 'asc'}]
26     }).eachPage(async (records, next) => {
27
28       await db('cities').insert(records.map(r => {
29         console.log(`Creating ${r.fields.Name}`);
30         stats.cityCount++;
31         return {
32           id: r.fields.id,
33           name: r.fields.Name
34         }
35       })).onConflict('id').merge();
36
37       next();
38     }).finally(() => {
39       resolve();
40     });
41   });
42 };
43
44 export async function createPaths(): Promise<void> {
45   return new Promise(async (resolve) => {
46     base('Paths').select().eachPage(async (records, next) => {
47       await db('paths').insert(records.map(r => {
48         stats.paths++;
49         console.log(`Path from ${r.fields['Starting City Name'][0]} => ${r.fields['Ending City Name'][0]}`);
50         return {
51           starting_city: r.fields.starting_city_id[0],
52           ending_city: r.fields.ending_city_id[0]
53         }
54       })).onConflict(['starting_city', 'ending_city']).ignore();
55
56       next();
57     }).finally(() => {
58       resolve();
59     });
60   });
61 }
62
63 export async function createLocations(): Promise<void> {
64   return new Promise(async (resolve) => {
65     base('Locations').select().eachPage(async (records, next) => {
66
67       await db('locations').insert(records.map(r => {
68         console.log(`Create ${r.fields['name']} in ${r.fields['City Name'][0]}`);
69         return {
70           id: r.fields.id,
71           name: r.fields.name,
72           type: r.fields.Type,
73           city_id: r.fields.city_id[0],
74           display_order: r.fields["Display Order"],
75           event_name: r.fields['event_name']
76         }
77       })).onConflict('id').merge();
78
79       next();
80     }).finally(() => {
81       resolve();
82     })
83   });
84 }
85
86 export async function createAllCitiesAndLocations() {
87   return createCities().then(createPaths).then(createLocations);
88 }
89
90 if(!module.parent) {
91   createCities().then(createPaths).then(createLocations).then(() => {
92     console.log(`${stats.cityCount} Cities created`);
93     console.log(`${stats.paths} paths created`);
94     console.log('Complete');
95     process.exit(0);
96   }).catch(e => {
97     console.log(e);
98     process.exit(1);
99   });
100 }