Giter Site home page Giter Site logo

Clean Entities about stockeer HOT 9 CLOSED

rmandlx avatar rmandlx commented on August 21, 2024
Clean Entities

from stockeer.

Comments (9)

rmandlx avatar rmandlx commented on August 21, 2024 1
  1. Könnte klappen, muss das mal ausprobieren
  2. Klar

from stockeer.

joluj avatar joluj commented on August 21, 2024

Hat schon irgendwie geklappt, aber nicht schön.
Aber lass es so machen. Dann haben wir 3 Arten:

  • Entities: für die Datenbank
  • Dtos: fürn Austausch Frontend/Backend und ggf. für'n Store. Haben z.B. refs auf childrenIds, nicht auf children. Am besten auch ohne parentId usw
  • ???: Für die App. Refs auf children Objekte, nicht auf ids

from stockeer.

rmandlx avatar rmandlx commented on August 21, 2024

Also ich hab nochmal ein wenig experimentiert und bin mir jetzt ziemlich sicher, dass die Buildprobleme nicht von class-validator/typeorm, sondern einzig von @nestjs/swagger kommen (OmitType usw.)
deswegen denke ich, könnte man auch auf OmitType usw. verzichten und stattdessen Omit von Typescript selbst verwenden

export class ProductCreationDto implements Omit<ProductDto, 'id' | 'createdTime'>{
    @Expose()
    @IsString()
    name: string;
}

Einziger Nachteil wäre, dass man dann beim obigen Beispiel wahrscheinlich für name nochmal die Decorator setzen muss, da Omit<> ja ein Interface erzeugt, wodurch die Decorator aus ProductDto nicht mehr relevant sind. (Muss ich aber noch confirmen)

Aber immerhin hat man dann nicht so viel Codeduplikation. Dann können die Dtos, die im Backend sowieso schon zur Validierung benutzt werden, auch einfach im Frontend genau so verwendet werden.
Wie man dann im Frontend mit Entities umgeht ist Sache des Frontends, genauso wie es Sache des Backends ist, welche Entities man verwendet. Gemeinsame Basis stellen nur die Dtos dar.

from stockeer.

joluj avatar joluj commented on August 21, 2024
  1. Klappt es mit den swagger Zeug wenn man im Frontend import { ProductCreationDto } from '???'; mit import type { ProductCreationDto } from '???'; ersetzt? Da sollte dann hoffentlich auch nichts wirklich importiert werden.
  2. Für Konsistenz der Namensgebung: kann man die Entities dann auch mit dem Postfix entity erstellen? Dann gibt es ProductEntity, ProductDto und Product

from stockeer.

joluj avatar joluj commented on August 21, 2024

@richmandlx Weißt du noch, wie man das Problem reproduzieren konnte? Ich schaffs nicht mehr :D
Evtl. haben wirs auch dadurch gelöst, dass wir eben diese 3er Aufteilung haben und von den DTOs ausgehen.

from stockeer.

rmandlx avatar rmandlx commented on August 21, 2024

es sollte wahrscheinlich reichen, ne klasse in angular zu verwenden, die in aus einer lib kommt, die von @nestjs/swagger abhängt. (klasse darf auch nicht nur für typchecking verwendet werden, wie es zum Beispiel bei httpclient.get<ProductDto>(...) der Fall wäre)
Das hatte bei mir schon gereicht um angular zu breaken :D
Die class-validator annotationen sollten garnicht so n großen problem sein, auch wenn diese warnings in der konsole verursachen.

from stockeer.

joluj avatar joluj commented on August 21, 2024

Kk, ich probier's bei Zeiten nochmal damit. Hab's nur mit dem UserDto probiert und da gabs keine Probleme (außer die warnings wenn ich UserDto nicht nur als Typ verwendet hab, also z.B. const X = new UserDto ())

from stockeer.

joluj avatar joluj commented on August 21, 2024

image

Es kommen keine Probleme auf :D

Für was braucht man @nestjs/swagger und warum ist das eine Abhängigkeit in den DTOs?

Die class-validator warnings kommen nicht, wenn man die Types wie im Screenshot verwendent, d.h. kein new ProductDto() schreibt, sondern nur die die types

from stockeer.

rmandlx avatar rmandlx commented on August 21, 2024

Ums auch für die anderen nochmal klar zu machen:
el jablo und ich haben nochmal über die issues diskutiert und letztendlich wäre es schon geil die mapped-types von @nestjs/swagger zu verwenden. Das ist jetzt auch erstmal der plan, aber man kann dann die DTOs NUR als typen im frontend verwenden! So wie in jablos screenshot wird alles funktionieren. Sobald man aber bspw. const product = new ProductDto(...) macht, wird die dto lib (inklusive @nestjs/swagger) ins frontend mit eingebunden und weil @nestjs/swagger selbst wiederum viele dependencies hat, die im browser einfach nicht existieren, weil sie aus der node welt kommen (beispielsweise path), kann die angular app nicht mehr gebaut werden. Das sieht dann so aus:
image

Es gäbe einen relativ netten use case, für den ich trotzdem gerne die konkreten dto klassen im frontend benutzen würde: class-transformer
Dates werden übers netzwerk beispielsweise als strings gesendet. Also auch wenn im DTO ein Date definiert ist, wird im frontend nach dem api aufruf ein string ankommen. Ist halt wieder sehr fehleranfällig, weil der programmierer laut dto definition ein Date erwarten würde, aber sobald er irgendwann eine Date spezifische methode aufruft, wird es einen Fehler werfen... Das könnte man schön mit class-transformer handeln, indem man die http requests alle noch mal piped und plainToInstance verwendet:

this.httpClient.get<ProductDto>('test')
.pipe(dto => plainToInstance(ProductDto, dto, {excludeExtraneousValues: true}))
.subscribe(dto => {
   //das feld ist jetzt hier wieder ein Date, wenn der @Type(() => Date) decorator für das feld gesetzt wurde, danke an class-transformer :D
  console.log(dto.creationTime);
}

Aber wie gesagt, da @nestjs/swagger nicht mit dem frontend funktioniert, kann man das erstmal vergessen.
Ich hab mich auch mal über den obigen in rot geschriebenen Fehler informiert und denke, dass es sogar eine lösung wäre, zu sagen man will kein polyfill und konfiguriert einfach resolve.fallback {"path":false} aber ich hab nirgendwo im Netz gefunden, wo man das überhaupt konfigurieren könnte. Hier gibts n github issue, indem oft nur erklärt wurde, wie man den anderen fall löst, also dass es ein polyfill modul für den browser gibt und man das konfiguriert. Will aber auch nicht unnötig etliche polyfills definieren, die eh nicht gebraucht werden... angular/angular-cli#20819

from stockeer.

Related Issues (20)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.