chore(release): 0.4.0
[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]} (${r.fields.distance})`);
50         return {
51           starting_city: r.fields.starting_city_id[0],
52           ending_city: r.fields.ending_city_id[0],
53           distance: parseInt(r.fields.distance?.toString() || '20')
54         }
55       })).onConflict(['starting_city', 'ending_city']).merge();
56
57       next();
58     }).finally(() => {
59       resolve();
60     });
61   });
62 }
63
64 export async function createLocations(): Promise<void> {
65   return new Promise(async (resolve) => {
66     base('Locations').select().eachPage(async (records, next) => {
67
68       await db('locations').insert(records.map(r => {
69         console.log(`Create ${r.fields['name']} in ${r.fields['City Name'][0]}`);
70         return {
71           id: r.fields.id,
72           name: r.fields.name,
73           type: r.fields.Type,
74           city_id: r.fields.city_id[0],
75           display_order: r.fields["Display Order"],
76           event_name: r.fields['event_name'],
77           min_level: Math.max(parseInt(r.fields['Min Level'].toString()), 1)
78         }
79       })).onConflict('id').merge();
80
81       next();
82     }).finally(() => {
83       resolve();
84     })
85   });
86 }
87
88 export async function createAllCitiesAndLocations() {
89   return createCities().then(createPaths).then(createLocations);
90 }
91
92 if(!module.parent) {
93   createCities().then(createPaths).then(createLocations).then(() => {
94     console.log(`${stats.cityCount} Cities created`);
95     console.log(`${stats.paths} paths created`);
96     console.log('Complete');
97     process.exit(0);
98   }).catch(e => {
99     console.log(e);
100     process.exit(1);
101   });
102 }