Browse Source

query node - db changes cascading I

ondratra 3 years ago
parent
commit
2abd3d9308

+ 7 - 4
query-node/generated/graphql-server/src/modules/channel/channel.model.ts

@@ -22,15 +22,16 @@ export { AssetAvailability };
 
 @Model({ api: {} })
 export class Channel extends BaseModel {
-  @ManyToOne(() => Membership, (param: Membership) => param.channels, { skipGraphQLField: true, nullable: true })
+  @ManyToOne(() => Membership, (param: Membership) => param.channels, { skipGraphQLField: true, nullable: true, cascade: ["insert", "update"] })
   ownerMember?: Membership;
 
-  @ManyToOne(() => CuratorGroup, (param: CuratorGroup) => param.channels, { skipGraphQLField: true, nullable: true })
+  @ManyToOne(() => CuratorGroup, (param: CuratorGroup) => param.channels, { skipGraphQLField: true, nullable: true, cascade: ["insert", "update"]})
   ownerCuratorGroup?: CuratorGroup;
 
   @ManyToOne(() => ChannelCategory, (param: ChannelCategory) => param.channels, {
     skipGraphQLField: true,
     nullable: true,
+    cascade: ["insert", "update"],
   })
   category?: ChannelCategory;
 
@@ -55,6 +56,7 @@ export class Channel extends BaseModel {
   @ManyToOne(() => DataObject, (param: DataObject) => param.channelcoverPhotoDataObject, {
     skipGraphQLField: true,
     nullable: true,
+    cascade: ["insert", "update"],
   })
   coverPhotoDataObject?: DataObject;
 
@@ -72,6 +74,7 @@ export class Channel extends BaseModel {
   @ManyToOne(() => DataObject, (param: DataObject) => param.channelavatarDataObject, {
     skipGraphQLField: true,
     nullable: true,
+    cascade: ["insert", "update"],
   })
   avatarDataObject?: DataObject;
 
@@ -97,10 +100,10 @@ export class Channel extends BaseModel {
   })
   isCensored!: boolean;
 
-  @ManyToOne(() => Language, (param: Language) => param.channellanguage, { skipGraphQLField: true, nullable: true })
+  @ManyToOne(() => Language, (param: Language) => param.channellanguage, { skipGraphQLField: true, nullable: true, cascade: ["insert", "update"] })
   language?: Language;
 
-  @OneToMany(() => Video, (param: Video) => param.channel)
+  @OneToMany(() => Video, (param: Video) => param.channel, { cascade: ["insert", "update"] })
   videos?: Video[];
 
   @IntField({})

+ 1 - 1
query-node/generated/graphql-server/src/modules/curator-group/curator-group.model.ts

@@ -17,7 +17,7 @@ export class CuratorGroup extends BaseModel {
   })
   isActive!: boolean;
 
-  @OneToMany(() => Channel, (param: Channel) => param.ownerCuratorGroup)
+  @OneToMany(() => Channel, (param: Channel) => param.ownerCuratorGroup, { cascade: ["insert", "update"] })
   channels?: Channel[];
 
   constructor(init?: Partial<CuratorGroup>) {

+ 4 - 4
query-node/generated/graphql-server/src/modules/data-object/data-object.model.ts

@@ -71,16 +71,16 @@ export class DataObject extends BaseModel {
   })
   joystreamContentId!: string;
 
-  @OneToMany(() => Channel, (param: Channel) => param.coverPhotoDataObject, { nullable: true })
+  @OneToMany(() => Channel, (param: Channel) => param.coverPhotoDataObject, { nullable: true, cascade: ["insert", "update"] })
   channelcoverPhotoDataObject?: Channel[];
 
-  @OneToMany(() => Channel, (param: Channel) => param.avatarDataObject, { nullable: true })
+  @OneToMany(() => Channel, (param: Channel) => param.avatarDataObject, { nullable: true, cascade: ["insert", "update"] })
   channelavatarDataObject?: Channel[];
 
-  @OneToMany(() => Video, (param: Video) => param.thumbnailDataObject, { nullable: true })
+  @OneToMany(() => Video, (param: Video) => param.thumbnailDataObject, { nullable: true, cascade: ["insert", "update"] })
   videothumbnailDataObject?: Video[];
 
-  @OneToMany(() => Video, (param: Video) => param.mediaDataObject, { nullable: true })
+  @OneToMany(() => Video, (param: Video) => param.mediaDataObject, { nullable: true, cascade: ["insert", "update"] })
   videomediaDataObject?: Video[];
 
   constructor(init?: Partial<DataObject>) {

+ 1 - 1
query-node/generated/graphql-server/src/modules/featured-video/featured-video.model.ts

@@ -4,7 +4,7 @@ import { Video } from '../video/video.model';
 
 @Model({ api: {} })
 export class FeaturedVideo extends BaseModel {
-  @OneToOneJoin(() => Video, (param: Video) => param.featured)
+  @OneToOneJoin(() => Video, (param: Video) => param.featured, { cascade: ["insert", "update"] })
   video!: Video;
 
   constructor(init?: Partial<FeaturedVideo>) {

+ 2 - 2
query-node/generated/graphql-server/src/modules/language/language.model.ts

@@ -13,10 +13,10 @@ export class Language extends BaseModel {
   @IntField({})
   createdInBlock!: number;
 
-  @OneToMany(() => Channel, (param: Channel) => param.language, { nullable: true })
+  @OneToMany(() => Channel, (param: Channel) => param.language, { nullable: true, cascade: ["insert", "update"] })
   channellanguage?: Channel[];
 
-  @OneToMany(() => Video, (param: Video) => param.language, { nullable: true })
+  @OneToMany(() => Video, (param: Video) => param.language, { nullable: true, cascade: ["insert", "update"] })
   videolanguage?: Video[];
 
   constructor(init?: Partial<Language>) {

+ 1 - 1
query-node/generated/graphql-server/src/modules/license/license.model.ts

@@ -22,7 +22,7 @@ export class License extends BaseModel {
   })
   customText?: string;
 
-  @OneToMany(() => Video, (param: Video) => param.license, { nullable: true })
+  @OneToMany(() => Video, (param: Video) => param.license, { nullable: true, cascade: ["insert", "update"] })
   videolicense?: Video[];
 
   constructor(init?: Partial<License>) {

+ 1 - 1
query-node/generated/graphql-server/src/modules/membership/membership.model.ts

@@ -59,7 +59,7 @@ export class Membership extends BaseModel {
   })
   subscription?: BN;
 
-  @OneToMany(() => Channel, (param: Channel) => param.ownerMember)
+  @OneToMany(() => Channel, (param: Channel) => param.ownerMember, { cascade: ["insert", "update"] })
   channels?: Channel[];
 
   constructor(init?: Partial<Membership>) {

+ 1 - 1
query-node/generated/graphql-server/src/modules/video-category/video-category.model.ts

@@ -10,7 +10,7 @@ export class VideoCategory extends BaseModel {
   })
   name?: string;
 
-  @OneToMany(() => Video, (param: Video) => param.category)
+  @OneToMany(() => Video, (param: Video) => param.category, { cascade: ["insert", "update"] })
   videos?: Video[];
 
   @IntField({})

+ 1 - 1
query-node/generated/graphql-server/src/modules/video-media-encoding/video-media-encoding.model.ts

@@ -22,7 +22,7 @@ export class VideoMediaEncoding extends BaseModel {
   })
   mimeMediaType?: string;
 
-  @OneToMany(() => VideoMediaMetadata, (param: VideoMediaMetadata) => param.encoding, { nullable: true })
+  @OneToMany(() => VideoMediaMetadata, (param: VideoMediaMetadata) => param.encoding, { nullable: true, cascade: ["insert", "update"] })
   videomediametadataencoding?: VideoMediaMetadata[];
 
   constructor(init?: Partial<VideoMediaEncoding>) {

+ 2 - 1
query-node/generated/graphql-server/src/modules/video-media-metadata/video-media-metadata.model.ts

@@ -10,6 +10,7 @@ export class VideoMediaMetadata extends BaseModel {
   @ManyToOne(() => VideoMediaEncoding, (param: VideoMediaEncoding) => param.videomediametadataencoding, {
     skipGraphQLField: true,
     nullable: true,
+    cascade: ["insert", "update"],
   })
   encoding?: VideoMediaEncoding;
 
@@ -37,7 +38,7 @@ export class VideoMediaMetadata extends BaseModel {
   })
   size?: BN;
 
-  @OneToOne(() => Video, (param: Video) => param.mediaMetadata, { nullable: true })
+  @OneToOne(() => Video, (param: Video) => param.mediaMetadata, { nullable: true, cascade: ["insert", "update"] })
   video?: Video;
 
   @IntField({})

+ 8 - 6
query-node/generated/graphql-server/src/modules/video/video.model.ts

@@ -25,10 +25,10 @@ export { AssetAvailability };
 
 @Model({ api: {} })
 export class Video extends BaseModel {
-  @ManyToOne(() => Channel, (param: Channel) => param.videos, { skipGraphQLField: true })
+  @ManyToOne(() => Channel, (param: Channel) => param.videos, { skipGraphQLField: true, cascade: ["insert", "update"] })
   channel!: Channel;
 
-  @ManyToOne(() => VideoCategory, (param: VideoCategory) => param.videos, { skipGraphQLField: true, nullable: true })
+  @ManyToOne(() => VideoCategory, (param: VideoCategory) => param.videos, { skipGraphQLField: true, nullable: true, cascade: ["insert", "update"] })
   category?: VideoCategory;
 
   @StringField({
@@ -52,6 +52,7 @@ export class Video extends BaseModel {
   @ManyToOne(() => DataObject, (param: DataObject) => param.videothumbnailDataObject, {
     skipGraphQLField: true,
     nullable: true,
+    cascade: ["insert", "update"],
   })
   thumbnailDataObject?: DataObject;
 
@@ -66,7 +67,7 @@ export class Video extends BaseModel {
   })
   thumbnailAvailability!: AssetAvailability;
 
-  @ManyToOne(() => Language, (param: Language) => param.videolanguage, { skipGraphQLField: true, nullable: true })
+  @ManyToOne(() => Language, (param: Language) => param.videolanguage, { skipGraphQLField: true, nullable: true, cascade: ["insert", "update"] })
   language?: Language;
 
   @BooleanField({
@@ -98,12 +99,13 @@ export class Video extends BaseModel {
   })
   isExplicit?: boolean;
 
-  @ManyToOne(() => License, (param: License) => param.videolicense, { skipGraphQLField: true, nullable: true })
+  @ManyToOne(() => License, (param: License) => param.videolicense, { skipGraphQLField: true, nullable: true, cascade: ["insert", "update"] })
   license?: License;
 
   @ManyToOne(() => DataObject, (param: DataObject) => param.videomediaDataObject, {
     skipGraphQLField: true,
     nullable: true,
+    cascade: ["insert", "update"],
   })
   mediaDataObject?: DataObject;
 
@@ -118,7 +120,7 @@ export class Video extends BaseModel {
   })
   mediaAvailability!: AssetAvailability;
 
-  @OneToOneJoin(() => VideoMediaMetadata, (param: VideoMediaMetadata) => param.video, { nullable: true })
+  @OneToOneJoin(() => VideoMediaMetadata, (param: VideoMediaMetadata) => param.video, { nullable: true, cascade: ["insert", "update"] })
   mediaMetadata?: VideoMediaMetadata;
 
   @IntField({})
@@ -129,7 +131,7 @@ export class Video extends BaseModel {
   })
   isFeatured!: boolean;
 
-  @OneToOne(() => FeaturedVideo, (param: FeaturedVideo) => param.video, { nullable: true })
+  @OneToOne(() => FeaturedVideo, (param: FeaturedVideo) => param.video, { nullable: true, cascade: ["insert", "update"] })
   featured?: FeaturedVideo;
 
   constructor(init?: Partial<Video>) {

+ 7 - 3
query-node/mappings/src/content/utils.ts

@@ -1,6 +1,10 @@
-// TODO: can we rely on db having "foreign keys"? When item is deleted will automaticly be all relations to it unset?
-//       Similarly, will saving item also save all its related items no-yet-saved in db, or do they need to saved individually?
-//       Also, is the assumption that `db.save(MyType, {myProperty: undefined})` unsets value in db correct?
+// TODO: finish db cascade on save/remove; right now there is manually added `cascade: ["insert", "update"]` directive
+//       to all relations in `query-node/generated/graphql-server/src/modules/**/*.model.ts`. That should ensure all records
+//       are saved on one `db.save(...)` call. Missing features
+//       - find a proper way to cascade on remove or implement custom removals for every entity
+//       - convert manual changes done to `*model.ts` file into some patch or bash commands that can be executed
+//         every time query node codegen is run (that will overwrite said manual changes)
+//       - verify in integration tests that the records are trully created/updated/removed as expected
 
 import { SubstrateEvent } from '@dzlzv/hydra-common'
 import { DatabaseManager } from '@dzlzv/hydra-db-utils'