HEX
Server: nginx/1.24.0
System: Linux nowruzgan 6.8.0-57-generic #59-Ubuntu SMP PREEMPT_DYNAMIC Sat Mar 15 17:40:59 UTC 2025 x86_64
User: babak (1000)
PHP: 8.3.6
Disabled: NONE
Upload Files
File: //var/dev/shahnamag/front-end/src/app/data.types.ts
import { SortDirection } from "@angular/material/sort";

export interface ResponseDto {
  data: any,
  error: number
}

export interface ListResponseDto {
  data: {
    sum: number,
    list: any[]
  },
  error: number
}

export interface LangString {
  en: string,
  fa: string
}

export class Entity {
  absorb(data: any) {
    if(typeof data == 'number' || typeof data == 'string') {
      (this as any).id = data;
      return;
    }
    for(let key in data) (this as any)[key] = data[key];
  }

  get trans(): any {
    let o = {...this};
    delete o.meta;
    return o;
  }

  meta: any = {};
}

export class Batch<T extends Entity> {
  limit: number = 0;
  sum: number = 0;
  totalPages: number = 0;
  offset: number = 0;
  filter: string = '';
  constraints: any = {};
  meta: any = {};
  sort: string = "StartCreationDateRange";
  order: SortDirection = 'asc'
  list: T[] = [];
  private _page: number = 0;

  set page(v: number) {
    this._page = v;
    this.offset = this.limit*this._page;
  }

  get page(): number {
    return this._page;
  }

  constructor(/*private type: { new(data?: any): T ;}, */offset?: number, limit?: number) {
    this.limit = limit || this.limit;
    this.offset = offset || this.offset;
  }

  remove(m: T) {
    this.list = this.list.filter(el => (el as any).id!=(m as any).id)
  }

  /*absorb(batchData: any) {
    this.sum = batchData.sum;
    this.totalPages = Math.ceil(batchData.sum/this.limit);
    this.list = [...this.list, ...batchData.list.map((item: any) => new this.type(item))];
  }*/
}

export class Section extends Entity {
  constructor(data?: any) {
    super();
    if(data) this.absorb(data);
  }

  override absorb(data: any) {
    super.absorb(data);
    if(data.children)
      this.children = data.children.map((record: any) => new Section(record));
  }

  id: number = 0;
  start: number = 0;
  end: number = 0;
  title: LangString = {en: '', fa: ''};
  children: Section[] = [];
}

export class Verse extends Entity {
  constructor(data?: any) {
    super();
    if(data) this.absorb(data);
  }

  override absorb(data: any) {
    super.absorb(data);
    if(data.verseKeywords)
      this.verseKeywords = data.verseKeywords.map((record: any) => new VerseKeyword(record));
    if(data.versePersons)
      this.versePersons = data.versePersons.map((record: any) => new VersePerson(record));
    if(data.triplets)
      this.triplets = data.triplets.map((record: any) => new Triplet(record));
    if(data.prevs)
      this.prevs = data.prevs.map((record: any) => new Verse(record));
    if(data.nexts)
      this.nexts = data.nexts.map((record: any) => new Verse(record));
  }

  get mesras(): string[] {
    return this.content.split(/ *\/ */);
  }

  id: number = 0;
  content: string = '';
  verseKeywords: VerseKeyword[] = [];
  versePersons: VersePerson[] = [];
  triplets: Triplet[] = [];
  prevs: Verse[] = [];
  nexts: Verse[] = [];
}

export class VerseKeyword extends Entity {
  constructor(data?: any) {
    super();
    if(data) this.absorb(data);
  }

  override absorb(data: any) {
    super.absorb(data);
    this.meta.state =
    this.state = data.state || '';
    if(data.keyword)
      this.keyword = new Keyword(data.keyword);
  }

  id: number = 0;
  state: string = '';
  keyword: Keyword = new Keyword();
}

export class Keyword extends Entity {
  constructor(data?: any) {
    super();
    if(data) this.absorb(data);
  }

  override absorb(data: any) {
    super.absorb(data);
    this.desc.fa = data.descFa || '';
    this.desc.en = data.descEn || '';
  }

  id: number = 0;
  word: string = '';
  cat: string = '';
  transliteration: string = '';
  desc: LangString = {en: '', fa: ''};
}

export class VersePerson extends Entity {
  constructor(data?: any) {
    super();
    if(data) this.absorb(data);
  }

  override absorb(data: any) {
    super.absorb(data);
    this.state = data.state || '';
    if(data.person)
      this.person = new Person(data.person);
  }

  id: number = 0;
  state: string = '';
  person: Person = new Person();
}

export class Person extends Entity implements d3.SimulationNodeDatum {
  constructor(data?: any) {
    super();
    if(data) this.absorb(data);
  }

  override absorb(data: any) {
    super.absorb(data);
    if(data.alts)
      this.alts = data.alts.split('|');
    this.radius = 1.5*Math.log(this.verseCount + 15);
  }

  id: number = 0;
  name: string = '';
  alts: string[] = [];
  cats: number[] = [];
  transliteration: string = '';
  verseCount: number = 0;
  radius: number = 5;
  x: number = 0;
  y: number = 0;
  fx: number|null = null;
  fy: number|null = null;
}

export class Predicate extends Entity {
  constructor(data?: any) {
    super();
    if(data) this.absorb(data);
  }

  id: number = 0;
  label: LangString = {en: '', fa: ''};
}

export class Triplet extends Entity implements d3.SimulationLinkDatum<Person> {

  constructor(data?: any) {
    super();
    if(data) this.absorb(data);
  }

  override absorb(data: any) {
    super.absorb(data);
    if(data.predicateId)
      this.predicateIds = [data.predicateId];
    if(data.subject && !(data.subject instanceof Person))
      this.subject = this.source = new Person(data.subject);
    if(data.predicate && !(data.predicate instanceof Predicate))
      this.predicate = new Predicate(data.predicate);
    if(data.object && !(data.object instanceof Person))
      this.object = this.target = new Person(data.object);
    if(data.verse && !(data.verse instanceof Verse))
      this.verse = new Verse(data.verse);
  }

  override get trans() {
    return {
      id: this.id,
      subjectId: this.subject.id || this.subjectId,
      predicateId: this.predicate.id || this.predicate,
      objectId: this.object.id || this.objectId,
      verseId: this.verse.id || this.verseId,
    }
  }

  id: number = 0;
  subject: Person = new Person();
  predicate: Predicate = new Predicate();
  object: Person = new Person();
  verse: Verse = new Verse();

  source: Person = new Person();
  predicates: Predicate[] = [];
  target: Person = new Person();

  predicateIds: number[] = [];
  predicateId: number = 0;
  subjectId: number = 0;
  objectId: number = 0;
  verseId: number = 0;
}