aboutsummaryrefslogtreecommitdiff
path: root/src/server/database.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/server/database.ts')
-rw-r--r--src/server/database.ts56
1 files changed, 51 insertions, 5 deletions
diff --git a/src/server/database.ts b/src/server/database.ts
index db86b472d..db81245c1 100644
--- a/src/server/database.ts
+++ b/src/server/database.ts
@@ -5,19 +5,65 @@ import { Utils, emptyFunction } from '../Utils';
import { DashUploadUtils } from './DashUploadUtils';
import { Credentials } from 'google-auth-library';
import { GoogleApiServerUtils } from './apis/google/GoogleApiServerUtils';
+import * as mongoose from 'mongoose';
export namespace Database {
+ const schema = 'Dash';
+ const port = 27017;
+ export const url = `mongodb://localhost:${port}/${schema}`;
+
+ enum ConnectionStates {
+ disconnected = 0,
+ connected = 1,
+ connecting = 2,
+ disconnecting = 3,
+ uninitialized = 99,
+ }
+
+ export async function tryInitializeConnection() {
+ try {
+ const { connection } = mongoose;
+ process.on('SIGINT', () => {
+ connection.close(() => {
+ console.log(`SIGINT closed mongoose connection at ${url}`);
+ process.exit(0);
+ });
+ });
+ if (connection.readyState === ConnectionStates.disconnected) {
+ await new Promise<void>((resolve, reject) => {
+ connection.on('error', reject);
+ connection.on('disconnected', () => {
+ console.log(`disconnecting mongoose connection at ${url}`);
+ });
+ connection.on('connected', () => {
+ console.log(`mongoose established default connection at ${url}`);
+ resolve();
+ });
+ mongoose.connect(url, { useNewUrlParser: true });
+ });
+ }
+ } catch (e) {
+ console.error(`Mongoose FAILED to establish default connection at ${url} with the following error:`);
+ console.error(e);
+ console.log('Since a valid database connection is required to use Dash, the server process will now exit.\nPlease try again later.');
+ process.exit(1);
+ }
+ }
+
class Database {
public static DocumentsCollection = 'documents';
private MongoClient = mongodb.MongoClient;
- private url = 'mongodb://localhost:27017/Dash';
private currentWrites: { [id: string]: Promise<void> } = {};
private db?: mongodb.Db;
private onConnect: (() => void)[] = [];
constructor() {
- this.MongoClient.connect(this.url, (err, client) => {
+ this.MongoClient.connect(url, (_err, client) => {
+ if (!client) {
+ console.error("\nPlease start MongoDB by running 'mongod' in a terminal before continuing...\n");
+ process.exit(0);
+ }
this.db = client.db();
this.onConnect.forEach(fn => fn());
});
@@ -247,7 +293,7 @@ export namespace Database {
};
export const QueryUploadHistory = async (contentSize: number) => {
- return SanitizedSingletonQuery<DashUploadUtils.UploadInformation>({ contentSize }, AuxiliaryCollections.GooglePhotosUploadHistory);
+ return SanitizedSingletonQuery<DashUploadUtils.ImageUploadInformation>({ contentSize }, AuxiliaryCollections.GooglePhotosUploadHistory);
};
export namespace GoogleAuthenticationToken {
@@ -256,7 +302,7 @@ export namespace Database {
export type StoredCredentials = Credentials & { _id: string };
- export const Fetch = async (userId: string, removeId = true) => {
+ export const Fetch = async (userId: string, removeId = true): Promise<Opt<StoredCredentials>> => {
return SanitizedSingletonQuery<StoredCredentials>({ userId }, GoogleAuthentication, removeId);
};
@@ -276,7 +322,7 @@ export namespace Database {
}
- export const LogUpload = async (information: DashUploadUtils.UploadInformation) => {
+ export const LogUpload = async (information: DashUploadUtils.ImageUploadInformation) => {
const bundle = {
_id: Utils.GenerateDeterministicGuid(String(information.contentSize!)),
...information