You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

152 lines
4.1 KiB

import * as r from "rethinkdb";
import { createModelSchema, primitive, serialize, update } from "serializr";
import { Database } from "./Database";
import { User } from "./User";
export interface ISprinklersDevice {
id: string | undefined;
name: string;
}
export class SprinklersDevice implements ISprinklersDevice {
static readonly tableName = "SprinklersDevices";
id: string | undefined;
name: string = "";
private db: Database;
private _table: r.Table | null = null;
constructor(db: Database, data?: Partial<ISprinklersDevice>) {
this.db = db;
if (data) {
update(this, data);
}
}
static async createTable(db: Database) {
await db.db.tableCreate(SprinklersDevice.tableName).run(db.conn);
await db.db.table(SprinklersDevice.tableName).indexCreate("name").run(db.conn);
}
static async loadAll(db: Database): Promise<SprinklersDevice[]> {
const cursor = await db.db.table(SprinklersDevice.tableName)
.run(db.conn);
const users = await cursor.toArray();
return users.map((data) => {
return new SprinklersDevice(db, data);
});
}
static async load(db: Database, id: string): Promise<SprinklersDevice | null> {
const data = await db.db.table(SprinklersDevice.tableName)
.get(id)
.run(db.conn);
if (data == null) {
return null;
}
return new SprinklersDevice(db, data);
}
private static getTable(db: Database): r.Table {
return db.db.table(this.tableName);
}
private get table() {
if (!this._table) {
this._table = SprinklersDevice.getTable(this.db);
}
return this._table;
}
async create() {
const data = serialize(this);
delete data.id;
const result = await this.table
.insert(data)
.run(this.db.conn);
this.id = result.generated_keys[0];
}
async createOrUpdate() {
const data = serialize(this);
delete data.id;
const device = this.table.filter(r.row("name").eq(this.name));
const nameDoesNotExist = device.isEmpty();
const a: r.WriteResult = await r.branch(nameDoesNotExist,
this.table.insert(data) as r.Expression<any>,
device.nth(0).update(data) as r.Expression<any>)
.run(this.db.conn);
if (a.inserted > 0) {
this.id = a.generated_keys[0];
return true;
} else {
return false;
}
}
async addToUser(user: User | number) {
const userId = (typeof user === "number") ? user : user.id;
const userDevice = new UserSprinklersDevice(this.db, {
});
}
toJSON(): any {
return serialize(this);
}
}
createModelSchema(SprinklersDevice, {
id: primitive(),
name: primitive(),
});
export interface IUserSprinklersDevice {
id: string | undefined;
userId: string;
sprinklersDeviceId: string;
}
export class UserSprinklersDevice implements IUserSprinklersDevice {
static readonly tableName = "UserSprinklersDevices";
id: string | undefined;
userId: string = "";
sprinklersDeviceId: string = "";
private db: Database;
private _table: r.Table | null = null;
constructor(db: Database) {
this.db = db;
}
static async createTable(db: Database) {
await db.db.tableCreate(UserSprinklersDevice.tableName).run(db.conn);
await db.db.table(UserSprinklersDevice.tableName).indexCreate("userId").run(db.conn);
await db.db.table(UserSprinklersDevice.tableName).indexCreate("sprinklersDeviceId").run(db.conn);
}
private static getTable(db: Database): r.Table {
return db.db.table(this.tableName);
}
async create() {
const data = serialize(this);
delete data.id;
const result = await this.table
.insert(data)
.run(this.db.conn);
this.id = result.generated_keys[0];
}
private get table() {
if (!this._table) {
this._table = UserSprinklersDevice.getTable(this.db);
}
return this._table;
}
}