From acff469ba069b6f090adfd5ed91379c9f146aa77 Mon Sep 17 00:00:00 2001 From: Logan Hunt Date: Wed, 30 Mar 2022 15:18:16 -0600 Subject: Ability to add, remove, update radius and location of chatrooms with a leaflet --- .../migrations/1648605030863-AddChatRoom.ts | 20 +++++++--- .../1648669551959-AddDistanceFunction.ts | 45 ++++++++++++++++++++++ 2 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 server/database/migrations/1648669551959-AddDistanceFunction.ts (limited to 'server/database/migrations') diff --git a/server/database/migrations/1648605030863-AddChatRoom.ts b/server/database/migrations/1648605030863-AddChatRoom.ts index d8eed52..e4b5ca9 100644 --- a/server/database/migrations/1648605030863-AddChatRoom.ts +++ b/server/database/migrations/1648605030863-AddChatRoom.ts @@ -1,10 +1,10 @@ -import { MigrationInterface, QueryRunner, Table } from 'typeorm'; +import { MigrationInterface, QueryRunner, Table, TableForeignKey } from 'typeorm'; export class AddChatRoom1648605030863 implements MigrationInterface { public async up(queryRunner: QueryRunner): Promise { await queryRunner.createTable( new Table({ - name: 'chatroom', + name: 'chat_room', columns: [ { name: 'id', @@ -13,8 +13,8 @@ export class AddChatRoom1648605030863 implements MigrationInterface { isGenerated: true, }, { - name: 'name', - type: 'text', + name: 'userId', + type: 'int', isNullable: false, }, { @@ -35,9 +35,19 @@ export class AddChatRoom1648605030863 implements MigrationInterface { ], }), ); + + await queryRunner.createForeignKey( + 'chat_room', + new TableForeignKey({ + columnNames: ['userId'], + referencedColumnNames: ['id'], + referencedTableName: 'user', + onDelete: 'CASCADE', + }), + ); } public async down(queryRunner: QueryRunner): Promise { - await queryRunner.dropTable('chatroom'); + await queryRunner.dropTable('chat_room'); } } diff --git a/server/database/migrations/1648669551959-AddDistanceFunction.ts b/server/database/migrations/1648669551959-AddDistanceFunction.ts new file mode 100644 index 0000000..0890936 --- /dev/null +++ b/server/database/migrations/1648669551959-AddDistanceFunction.ts @@ -0,0 +1,45 @@ +import { MigrationInterface, QueryRunner } from 'typeorm'; + +export class AddDistanceFunction1648669551959 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + // From https://stackoverflow.com/questions/61135374/postgresql-calculate-distance-between-two-points-without-using-postgis + await queryRunner.query(` +CREATE OR REPLACE FUNCTION calculate_distance(lat1 float, lon1 float, lat2 float, lon2 float, units varchar) + RETURNS float AS $dist$ + DECLARE + dist float = 0; + radlat1 float; + radlat2 float; + theta float; + radtheta float; + BEGIN + IF lat1 = lat2 OR lon1 = lon2 + THEN RETURN dist; + ELSE + radlat1 = pi() * lat1 / 180; + radlat2 = pi() * lat2 / 180; + theta = lon1 - lon2; + radtheta = pi() * theta / 180; + dist = sin(radlat1) * sin(radlat2) + cos(radlat1) * cos(radlat2) * cos(radtheta); + + IF dist > 1 THEN dist = 1; END IF; + + dist = acos(dist); + dist = dist * 180 / pi(); + dist = dist * 60 * 1.1515; + + IF units = 'K' THEN dist = dist * 1.609344; END IF; + IF units = 'N' THEN dist = dist * 0.8684; END IF; + + RETURN dist; + END IF; + END; + $dist$ LANGUAGE plpgsql;`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query( + `DROP FUNCTION IF EXISTS calculate_distance(lat1 float, lon1 float, lat2 float, lon2 float, units varchar);`, + ); + } +} -- cgit v1.2.3-70-g09d2