jinaga
Version:
Data management for web and mobile applications.
176 lines (159 loc) • 4.48 kB
text/typescript
import { buildModel, FactRepository, LabelOf, ModelBuilder } from "../src/specification/model";
export class User {
static Type = "User" as const;
type = User.Type;
constructor(
public publicKey: string
) { }
}
export class UserName {
static Type = "User.Name" as const;
type = UserName.Type;
constructor(
public user: User,
public value: string,
public prior: UserName[]
) { }
}
export class Company {
static Type = "Company" as const;
type = Company.Type;
constructor(
public creator: User,
public identifier: string
) { }
}
export class Administrator {
static Type = "Administrator" as const;
type = Administrator.Type;
constructor(
public company: Company,
public user: User,
public date: Date | string
) { }
}
export class AdministratorRevoked {
static Type = "Administrator.Revoked" as const;
type = AdministratorRevoked.Type;
constructor(
public administrator: Administrator
) { }
}
export class Office {
static Type = "Office" as const;
type = Office.Type;
constructor(
public company: Company,
public identifier: string
) { }
static inCompany(facts: FactRepository, company: LabelOf<Company>) {
return facts.ofType(Office)
.join(office => office.company, company)
.notExists(office => facts.ofType(OfficeClosed)
.join(officeClosed => officeClosed.office, office)
.notExists(officeClosed => facts.ofType(OfficeReopened)
.join(officeReopened => officeReopened.officeClosed, officeClosed)
)
);
}
}
export class OfficeClosed {
static Type = "Office.Closed" as const;
type = OfficeClosed.Type;
constructor(
public office: Office,
public date: Date | string
) { }
}
export class OfficeReopened {
static Type = "Office.Reopened" as const;
type = OfficeReopened.Type;
constructor(
public officeClosed: OfficeClosed
) { }
}
export class President {
static Type = "President" as const;
type = President.Type;
constructor(
public office: Office,
public user: User
) { }
}
export class Manager {
static Type = "Manager" as const;
type = Manager.Type;
constructor(
public office: Office,
public employeeNumber: number
) { }
}
export class ManagerName {
static Type = "Manager.Name" as const;
type = ManagerName.Type;
constructor(
public manager: Manager,
public value: string,
public prior: ManagerName[]
) { }
}
export class ManagerTerminated {
static Type = "Manager.Terminated" as const;
type = ManagerTerminated.Type;
constructor(
public manager: Manager,
public date: Date | string
) { }
}
export class Employee {
static Type = "Employee" as const;
type = Employee.Type;
constructor(
public office: Office,
public user: User
) { }
}
const officeFacts = (m: ModelBuilder) => m
.type(User)
.type(UserName, f => f
.predecessor("user", User)
.predecessor("prior", UserName)
)
.type(Company, f => f
.predecessor("creator", User)
)
.type(Administrator, f => f
.predecessor("company", Company)
.predecessor("user", User)
)
.type(AdministratorRevoked, f => f
.predecessor("administrator", Administrator)
)
.type(Office, f => f
.predecessor("company", Company)
)
.type(OfficeClosed, f => f
.predecessor("office", Office)
)
.type(OfficeReopened, f => f
.predecessor("officeClosed", OfficeClosed)
)
.type(President, f => f
.predecessor("office", Office)
.predecessor("user", User)
)
.type(Manager, f => f
.predecessor("office", Office)
)
.type(ManagerName, f => f
.predecessor("manager", Manager)
.predecessor("prior", ManagerName)
)
.type(ManagerTerminated, f => f
.predecessor("manager", Manager)
)
.type(Employee, f => f
.predecessor("office", Office)
.predecessor("user", User)
);
export const model = buildModel(officeFacts);