javascript - Kuinka käyttää "groups" -ominaisuutta "class-transformer" -kirjastossa sisäkkäisissä komponenteissa
Yritän rajoittaa pääsyä joihinkin ominaisuuksiin vain käyttäjille, joilla on kyseinen ominaisuus ryhmässään syvästi upotetussa käyttöliittymässä, enkä pysty pääsemään käsiksi 'groups'-metatietoihin upotetuissa komponenteissa.
Tässä on koodiesimerkki:
Vastauksen esimerkki:
export class ProductResponseInterface {
// groups work fine here
@ValidateNested()
success: boolean;
@Type(() => ProductFetchResponseInterface)
data?: ProductFetchResponseInterface;
error?: string;
@Exclude()
groups?: string[];
constructor(partial: Partial<ProductResponseInterface>) {
Object.assign(this, partial);
}
}
export class ProductFetchResponseInterface {
// groups seem to be undefined here
@ValidateNested()
@Type(() => ProductInterface)
@Expose({ groups: ['eshop.products'] })
products: ProductInterface[];
@Exclude()
groups: string[];
count: number;
constructor(partial: Partial<ProductFetchResponseInterface>) {
Object.assign(this, partial);
}
}
export class ProductInterface {
// groups seems to be undefined here
@Expose({ groups: ['eshop.products.product.id', 'admin'] })
id: number;
@Expose({ groups: ['eshop.products.product.name'] })
name: string;
...
constructor(partial: Partial<ProductInterface>) {
Object.assign(this, partial);
}
}
Ongelma: ProductFetchResponseInterface- ja ProductInterface-rajapinnat eivät pääse käsiksi "groups"-tunnisteeseen, ja niiden vastaus palauttaa tyhjiä tuotteita.
Tämä on kutsu, joka käyttää näitä käyttöliittymiä
const http_response = await this.handle_request(url);
// { success: true, data: { products: [ { id: 1, name: 'product_name' }]}}
return plainToInstance(
ProductResponseInterface,
{
...response,
groups: user.access_permissions_populated // ['eshop.products', 'eshop.products.product.id',...],
},
{},
);
Onko ideaa, miten saada se toimimaan? Kiitos.
Vastaus #1
Sinun täytyy kutsua plainToInstance näin
plainToInstance(ProductResponseInterface, plainObject, { groups: ["eshop.products", "eshop.products.product.name", "eshop.products.product.id"] })
On testi esimerkki
import "reflect-metadata";
import { plainToInstance } from "class-transformer"
import { ProductResponseInterface } from "./test"
describe("", () => {
it("tranform items by groups attribute", () => {
const raw = { success: true, data: { products: [{ id: 1, name: 'product_name' }] } }
const res = plainToInstance(ProductResponseInterface, raw, { groups: ["eshop.products", "eshop.products.product.name", "eshop.products.product.id"] })
const exp: ProductResponseInterface = {
success: true,
data: {
products: [
{
id: 1,
name: "product_name"
}
],
groups: undefined,
count: undefined,
}
}
expect(res).toEqual(exp);
});
});
