Skip to content

Commit

Permalink
polymorphic relationships
Browse files Browse the repository at this point in the history
  • Loading branch information
LinboLen committed Jul 8, 2024
1 parent a69c991 commit 39a1bcf
Show file tree
Hide file tree
Showing 10 changed files with 276 additions and 51 deletions.
Original file line number Diff line number Diff line change
@@ -1,22 +1,17 @@
import { Test, TestingModule } from '@nestjs/testing';

import { AppController } from './app.controller';
import { AppService } from './app.service';

describe('AppController', () => {
let app: TestingModule;

beforeAll(async () => {
app = await Test.createTestingModule({
controllers: [AppController],
providers: [AppService],
providers: [],
}).compile();
});

describe('getData', () => {
it('should return "Hello API"', () => {
const appController = app.get<AppController>(AppController);
expect(appController.getData()).toEqual({ message: 'Hello API' });
});
});
});
99 changes: 91 additions & 8 deletions apps/polymorphic-relationships/src/app/app.controller.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,96 @@
import { Controller, Get } from '@nestjs/common';

import { AppService } from './app.service';
import { Controller, Get, OnModuleInit } from '@nestjs/common';
import { Image } from './models/image.model';
import { User } from './models/user.model';
import { db, schema } from '@gradii/fedaco';
import { faker } from '@faker-js/faker';

@Controller()
export class AppController {
constructor(private readonly appService: AppService) {}
export class AppController implements OnModuleInit {
onModuleInit() {
db().enableQueryLog();
}

@Get('/init-table')
async initTable() {
await schema().create('users', table => {
table.increments('id');
table.char('name').withLength(250);
table.char('email').withLength(250);
table.timestamps();
});

await schema().create('posts', table => {
table.increments('id');
table.char('name').withLength(250);
table.timestamps();
});

await schema().create('images', function (table) {
table.increments('id');
table.morphs('imageable');
table.string('url');
table.timestamps();
});

}

@Get('/all-users')
async getAllUsers() {
db().flushQueryLog();
const list = await User.createQuery().get();

const logs = db().getQueryLog();
return {list, logs};
}

@Get('/add-user')
async addUser() {
await User.createQuery().create({
name : faker.person.fullName(),
email: faker.internet.email()
});
}


@Get('/all-images')
async getImages() {
db().flushQueryLog();
const list = await Image.createQuery().get();

const logs = db().getQueryLog();
return {list, logs};
}

@Get('/create-user-image')
async createUserImage() {
db().flushQueryLog();
const user = await User.createQuery().first();

await user.NewRelation('image').create({
url: faker.internet.url()
});

const logs = await db().getQueryLog();
return {user, logs};
}

@Get('/get-user-image')
async getUserImage() {
db().flushQueryLog();

const user = await User.createQuery().first();
const image = await user.image;
const logs = await db().getQueryLog();
return {user, image, logs};
}

@Get('/get-image-user')
async getImageUser() {
db().flushQueryLog();

@Get()
getData() {
return this.appService.getData();
const image = await Image.createQuery().first();
const user = await image.imageable;
const logs = await db().getQueryLog();
return {image, user, logs};
}
}
15 changes: 12 additions & 3 deletions apps/polymorphic-relationships/src/app/app.module.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,20 @@
import { Module } from '@nestjs/common';

import { AppController } from './app.controller';
import { AppService } from './app.service';
import { FedacoModule } from '@gradii/nest-fedaco';

@Module({
imports: [],
imports: [
FedacoModule.forRoot({
'default': {
driver: 'mysql',
database: 'test',
username: 'root',
password: '123456'
}
})
],
controllers: [AppController],
providers: [AppService],
providers: [],
})
export class AppModule {}
21 changes: 0 additions & 21 deletions apps/polymorphic-relationships/src/app/app.service.spec.ts

This file was deleted.

8 changes: 0 additions & 8 deletions apps/polymorphic-relationships/src/app/app.service.ts

This file was deleted.

28 changes: 28 additions & 0 deletions apps/polymorphic-relationships/src/app/models/image.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
import { Column, forwardRef, Model, MorphToColumn, PrimaryGeneratedColumn, Table } from '@gradii/fedaco';
import { Post } from './post.model';
import { User } from './user.model';


@Table({
tableName: 'images'
})
export class Image extends Model {
_fillable = ['url'];

@PrimaryGeneratedColumn()
id: number;

@Column()
url: string;

@MorphToColumn({
morphTypeMap: {
'Post': forwardRef(() => Post),
'User': forwardRef(() => User),
'test_user': forwardRef(() => User),
'test_post': forwardRef(() => Post),
}
})
imageable: any;

}
35 changes: 35 additions & 0 deletions apps/polymorphic-relationships/src/app/models/post.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import {
Column,
CreatedAtColumn, FedacoRelationType,
forwardRef,
MorphOneColumn,
PrimaryGeneratedColumn,
Table,
UpdatedAtColumn
} from '@gradii/fedaco';
import { Image } from './image.model';

@Table({
tableName: 'posts',
morphTypeName: 'test_post'
})
export class Post {

@PrimaryGeneratedColumn()
id: number;

@Column()
name: string;

@MorphOneColumn({
related: forwardRef(() => Image),
morphName: 'imageable'
})
public image: FedacoRelationType<Image>;

@CreatedAtColumn()
created_at: Date;

@UpdatedAtColumn()
updated_at: Date;
}
40 changes: 40 additions & 0 deletions apps/polymorphic-relationships/src/app/models/user.model.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
import {
Column,
CreatedAtColumn,
forwardRef,
Model,
MorphOneColumn,
PrimaryGeneratedColumn, RelationType,
Table, UpdatedAtColumn,
FedacoRelationType
} from '@gradii/fedaco';
import { Image } from './image.model';

@Table({
tableName: 'users',
morphTypeName: 'test_user'
})
export class User extends Model {
_fillable = ['name', 'email'];

@PrimaryGeneratedColumn()
id: number;

@Column()
name: string;

@Column()
email: string;

@MorphOneColumn({
related: forwardRef(() => Image),
morphName: 'imageable'
})
public image: FedacoRelationType<Image>;

@CreatedAtColumn()
created_at: Date;

@UpdatedAtColumn()
updated_at: Date;
}
3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,14 @@
"private": true,
"dependencies": {
"@faker-js/faker": "^8.4.1",
"@gradii/fedaco": "^1.1.2",
"@gradii/fedaco": "^1.1.3",
"@gradii/nest-fedaco": "^0.0.2",
"@nestjs/common": "^10.0.2",
"@nestjs/core": "^10.0.2",
"@nestjs/platform-express": "^10.0.2",
"axios": "^1.6.0",
"better-sqlite3": "^11.1.2",
"mysql2": "^3.10.2",
"reflect-metadata": "^0.1.13",
"rxjs": "^7.8.0",
"tslib": "^2.3.0"
Expand Down
Loading

0 comments on commit 39a1bcf

Please sign in to comment.