Handling subfileds as colunm in list

This commit is contained in:
2023-02-08 03:27:28 +01:00
parent c5910ef22e
commit 4ee649a814
3 changed files with 120 additions and 40 deletions

View File

@@ -1,6 +1,7 @@
import { Observable } from "rxjs";
import { Injectable } from "@angular/core";
import { ApiService } from "./crud.service";
import {JSONSchema7} from "json-schema";
@Injectable({
@@ -42,7 +43,7 @@ export class JsonschemasService {
for (let i in prop.oneOf) {
this.resolveReference(resource, prop.oneOf[i]);
}
} else if (prop.hasOwnProperty('items') && this.is_reference(prop.items)) {
} else if (this.is_array(prop) && this.is_reference(prop.items)) {
this.resolveReference(resource, prop.items);
}
}
@@ -61,6 +62,10 @@ export class JsonschemasService {
}
}
getReferencedSchema() {
}
getCreateResource(resourceName: string): Observable<Schema> {
return new Observable<Schema>((observer) => {
this.getSchemas().subscribe(() => {
@@ -91,10 +96,18 @@ export class JsonschemasService {
})
}
private is_object(prop: any) {
return prop.hasOwnProperty('properties')
}
private is_reference(prop: any) {
return prop.hasOwnProperty('$ref');
}
private is_array(prop: any) {
return prop.hasOwnProperty('items');
}
private is_union(prop: any) {
return prop.hasOwnProperty('oneOf');
}
@@ -102,6 +115,67 @@ export class JsonschemasService {
private get_reference_name(prop: any) {
return prop['$ref'].substring(prop['$ref'].lastIndexOf('/')+1);
}
has_descendant(resource: JSONSchema7, property_name: string): boolean {
if (this.is_array(resource)) {
return property_name == 'items';
} else if (this.is_object(resource)) {
return property_name in resource.properties!;
} else if (this.is_reference(resource)) {
let subresourceName = this.get_reference_name(resource);
return this.has_descendant(this.buildResource(subresourceName), property_name);
} else if (this.is_union(resource)) {
for (const ref of resource.oneOf!) {
// @ts-ignore
if (this.has_descendant(ref, property_name)) {
return true;
}
return false;
}
}
throw new Error("Jsonschema format not implemented in property finder");
return false;
}
get_descendant(resource: JSONSchema7, property_name: string): JSONSchema7 {
if (this.is_array(resource) && property_name == 'items') {
// @ts-ignore
return resource.items;
} else if (this.is_object(resource) && property_name in resource.properties!) {
// @ts-ignore
return resource.properties[property_name];
} else if (this.is_reference(resource)) {
let subresourceName = this.get_reference_name(resource);
let subresource = this.buildResource(subresourceName);
return this.get_descendant(subresource, property_name);
} else if (this.is_union(resource)) {
for (const ref of resource.oneOf!) {
// @ts-ignore
if (this.has_property(ref, property_name)) {
// @ts-ignore
return this.get_descendant(ref, property_name);
}
}
}
throw new Error("property not found or Jsonschema format not implemented");
}
path_exists(resource: JSONSchema7, path: string): boolean{
const pointFirstPosition = path.indexOf('.')
if (pointFirstPosition == -1) {
return this.has_descendant(resource, path);
}
return this.has_descendant(resource, path.substring(0, pointFirstPosition))
&& this.path_exists(
this.get_descendant(
resource,
path.substring(0, pointFirstPosition)
),
path.substring(pointFirstPosition + 1)
);
}
}
export interface Schema {