Skip to content

Commit 0babd42

Browse files
committedFeb 4, 2024
update to v6
1 parent 145c329 commit 0babd42

12 files changed

+1017
-1262
lines changed
 

‎app/controllers/author.controller.ts

+16-9
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,32 @@
1-
import { QueryOrder } from '@mikro-orm/core';
1+
import { QueryOrder } from '@mikro-orm/better-sqlite';
22
import { Context } from 'koa';
33
import Router from 'koa-router';
44

55
import { DI } from '../server';
66
import { Author } from '../entities';
7+
import { z } from 'zod';
78

89
const router = new Router();
910

1011
router.get('/', async (ctx: Context) => {
11-
ctx.body = await DI.authorRepository.findAll(['books'], { name: QueryOrder.DESC }, 20);
12+
ctx.body = await DI.authors.findAll({
13+
populate: ['books'],
14+
orderBy: { name: QueryOrder.DESC },
15+
limit: 20,
16+
});
1217
});
1318

1419
router.get('/:id', async (ctx: Context) => {
1520
try {
16-
const author = await DI.authorRepository.findOne(ctx.query.id, ['books']);
21+
const query = z.object({ id: z.number() }).parse(ctx.query);
22+
const author = await DI.authors.findOne(query.id, { populate: ['books'] });
1723

1824
if (!author) {
1925
return ctx.throw(404, { message: 'Author not found' });
2026
}
2127

2228
ctx.body = author;
23-
} catch (e) {
29+
} catch (e: any) {
2430
console.error(e);
2531
return ctx.throw(400, { message: e.message });
2632
}
@@ -33,28 +39,29 @@ router.post('/', async (ctx: Context) => {
3339

3440
try {
3541
const author = DI.em.create(Author, ctx.request.body);
36-
await DI.authorRepository.persist(author).flush();
42+
await DI.em.flush();
3743

3844
ctx.body = author;
39-
} catch (e) {
45+
} catch (e: any) {
4046
console.error(e);
4147
return ctx.throw(400, { message: e.message });
4248
}
4349
});
4450

4551
router.put('/:id', async (ctx: Context) => {
4652
try {
47-
const author = await DI.authorRepository.findOne(ctx.params.id);
53+
const query = z.object({ id: z.number() }).parse(ctx.query);
54+
const author = await DI.authors.findOne(query.id);
4855

4956
if (!author) {
5057
return ctx.throw(404, { message: 'Author not found' });
5158
}
5259

5360
DI.em.assign(author, ctx.request.body);
54-
await DI.authorRepository.persist(author).flush();
61+
await DI.em.flush();
5562

5663
ctx.body = author;
57-
} catch (e) {
64+
} catch (e: any) {
5865
console.error(e);
5966
return ctx.throw(400, { message: e.message });
6067
}

‎app/controllers/book.controller.ts

+17-10
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,31 @@
1-
import { QueryOrder, wrap } from '@mikro-orm/core';
1+
import { QueryOrder, wrap } from '@mikro-orm/better-sqlite';
22
import { Context } from 'koa';
33
import Router from 'koa-router';
44

55
import { DI } from '../server';
6+
import { z } from 'zod';
67

78
const router = new Router();
89

910
router.get('/', async (ctx: Context) => {
10-
ctx.body = await DI.bookRepository.findAll(['author'], { title: QueryOrder.DESC }, 20);
11+
ctx.body = await DI.books.findAll({
12+
populate: ['author'],
13+
orderBy: { title: QueryOrder.DESC },
14+
limit: 20,
15+
});
1116
});
1217

1318
router.get('/:id', async (ctx: Context) => {
1419
try {
15-
const book = await DI.bookRepository.findOne(ctx.query.id, ['author']);
20+
const query = z.object({ id: z.number() }).parse(ctx.query);
21+
const book = await DI.books.findOne(query.id, { populate: ['author'] });
1622

1723
if (!book) {
1824
return ctx.throw(404, { message: 'Book not found' });
1925
}
2026

2127
ctx.body = book;
22-
} catch (e) {
28+
} catch (e: any) {
2329
console.error(e);
2430
return ctx.throw(400, { message: e.message });
2531
}
@@ -31,29 +37,30 @@ router.post('/', async (ctx: Context) => {
3137
}
3238

3339
try {
34-
const book = DI.bookRepository.create(ctx.request.body);
35-
await DI.bookRepository.persist(book).flush();
40+
const book = DI.books.create(ctx.request.body);
41+
await DI.em.flush();
3642

3743
ctx.body = book;
38-
} catch (e) {
44+
} catch (e: any) {
3945
console.error(e);
4046
return ctx.throw(400, { message: e.message });
4147
}
4248
});
4349

4450
router.put('/:id', async (ctx: Context) => {
4551
try {
46-
const book = await DI.bookRepository.findOne(ctx.query.id);
52+
const query = z.object({ id: z.number() }).parse(ctx.query);
53+
const book = await DI.books.findOne(query.id);
4754

4855
if (!book) {
4956
return ctx.throw(404, { message: 'Book not found' });
5057
}
5158

5259
wrap(book).assign(ctx.request.body);
53-
await DI.bookRepository.persist(book).flush();
60+
await DI.em.flush();
5461

5562
ctx.body = book;
56-
} catch (e) {
63+
} catch (e: any) {
5764
console.error(e);
5865
return ctx.throw(400, { message: e.message });
5966
}

‎app/entities/Author.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Cascade, Collection, Entity, OneToMany, Property, ManyToOne, Unique } from '@mikro-orm/core';
1+
import { Cascade, Collection, Entity, OneToMany, Property, ManyToOne, Unique } from '@mikro-orm/better-sqlite';
22

33
import { Book } from '.';
44
import { BaseEntity } from './BaseEntity';

‎app/entities/BaseEntity.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
1-
import { PrimaryKey, Property } from '@mikro-orm/core';
1+
import { PrimaryKey, Property } from '@mikro-orm/better-sqlite';
22

33
export abstract class BaseEntity {
44

55
@PrimaryKey()
66
id!: number;
77

88
@Property()
9-
createdAt: Date = new Date();
9+
createdAt = new Date();
1010

1111
@Property({ onUpdate: () => new Date() })
12-
updatedAt: Date = new Date();
12+
updatedAt = new Date();
1313

1414
}

‎app/entities/Book.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Cascade, Collection, Entity, ManyToMany, ManyToOne, Property } from '@mikro-orm/core';
1+
import { Cascade, Collection, Entity, ManyToMany, ManyToOne, Property } from '@mikro-orm/better-sqlite';
22
import { Author, BookTag, Publisher } from './index';
33
import { BaseEntity } from './BaseEntity';
44

‎app/entities/BookTag.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Collection, Entity, ManyToMany, PrimaryKey, Property } from '@mikro-orm/core';
1+
import { Collection, Entity, ManyToMany, PrimaryKey, Property } from '@mikro-orm/better-sqlite';
22
import { Book } from '.';
33

44
@Entity()
@@ -11,7 +11,7 @@ export class BookTag {
1111
name: string;
1212

1313
@ManyToMany(() => Book, b => b.tags)
14-
books: Collection<Book> = new Collection<Book>(this);
14+
books = new Collection<Book>(this);
1515

1616
constructor(name: string) {
1717
this.name = name;

‎app/entities/Publisher.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Collection, Entity, Enum, OneToMany, PrimaryKey, Property } from '@mikro-orm/core';
1+
import { Collection, Entity, Enum, OneToMany, PrimaryKey, Property } from '@mikro-orm/better-sqlite';
22
import { Book } from '.';
33

44
@Entity()

‎app/mikro-orm.config.ts

+4-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
import { Options } from '@mikro-orm/core';
2-
import { Author, Book, BookTag, Publisher, BaseEntity } from './entities';
1+
import { defineConfig } from '@mikro-orm/better-sqlite';
32
import { SqlHighlighter } from '@mikro-orm/sql-highlighter';
3+
import { Author, Book, BookTag, Publisher, BaseEntity } from './entities';
44

5-
const config: Options = {
6-
type: 'sqlite',
5+
export default defineConfig({
76
dbName: 'test.db',
87
// as we are using class references here, we don't need to specify `entitiesTs` option
98
entities: [Author, Book, BookTag, Publisher, BaseEntity],
109
highlighter: new SqlHighlighter(),
1110
debug: true,
12-
};
13-
14-
export default config;
11+
});

‎app/server.ts

+10-8
Original file line numberDiff line numberDiff line change
@@ -2,17 +2,17 @@ import 'reflect-metadata';
22

33
import Koa, { Context } from 'koa';
44
import Router from 'koa-router';
5-
import bodyParser from 'koa-body';
6-
import { EntityManager, EntityRepository, MikroORM, RequestContext } from '@mikro-orm/core';
5+
import { koaBody } from 'koa-body';
6+
import { EntityManager, EntityRepository, MikroORM, RequestContext } from '@mikro-orm/better-sqlite';
77

88
import { AuthorController, BookController } from './controllers';
99
import { Author, Book } from './entities';
1010

1111
export const DI = {} as {
1212
orm: MikroORM,
1313
em: EntityManager,
14-
authorRepository: EntityRepository<Author>,
15-
bookRepository: EntityRepository<Book>,
14+
authors: EntityRepository<Author>,
15+
books: EntityRepository<Book>,
1616
};
1717

1818
export const app = new Koa();
@@ -28,11 +28,13 @@ const port = process.env.PORT || 3000;
2828
(async () => {
2929
DI.orm = await MikroORM.init(); // CLI config will be used automatically
3030
DI.em = DI.orm.em;
31-
DI.authorRepository = DI.orm.em.getRepository(Author);
32-
DI.bookRepository = DI.orm.em.getRepository(Book);
31+
DI.authors = DI.orm.em.getRepository(Author);
32+
DI.books = DI.orm.em.getRepository(Book);
3333

34-
app.use(bodyParser());
35-
app.use((ctx, next) => RequestContext.createAsync(DI.orm.em, next));
34+
await DI.orm.schema.updateSchema();
35+
36+
app.use(koaBody());
37+
app.use((ctx, next) => RequestContext.create(DI.orm.em, next));
3638
app.use(api.routes());
3739
app.use(api.allowedMethods());
3840
app.use((ctx, next) => {

‎package.json

+14-12
Original file line numberDiff line numberDiff line change
@@ -35,21 +35,23 @@
3535
]
3636
},
3737
"dependencies": {
38-
"@mikro-orm/core": "^5.0.0",
38+
"@mikro-orm/better-sqlite": "^6.0.0",
39+
"@mikro-orm/core": "^6.0.0",
3940
"@mikro-orm/sql-highlighter": "^1.0.1",
40-
"@mikro-orm/sqlite": "^5.0.0",
41-
"koa": "^2.13.0",
42-
"koa-body": "^4.2.0",
43-
"koa-router": "^10.0.0",
44-
"reflect-metadata": "^0.1.13",
45-
"typescript": "4.6.3"
41+
"koa": "^2.15.0",
42+
"koa-body": "^6.0.1",
43+
"koa-router": "^12.0.1",
44+
"reflect-metadata": "^0.2.1",
45+
"typescript": "5.3.3",
46+
"zod": "^3.22.4"
4647
},
4748
"devDependencies": {
48-
"@mikro-orm/cli": "^5.0.0",
49-
"@types/koa": "^2.11.3",
50-
"@types/koa-router": "^7.4.1",
51-
"nodemon": "^2.0.4",
52-
"ts-node": "^10.0.0"
49+
"@mikro-orm/cli": "^6.0.0",
50+
"@types/koa": "^2.14.0",
51+
"@types/koa-router": "^7.4.8",
52+
"@types/node": "^20.11.16",
53+
"nodemon": "^3.0.3",
54+
"ts-node": "^10.9.2"
5355
},
5456
"mikro-orm": {
5557
"useTsNode": true,

‎tsconfig.json

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
{
22
"compilerOptions": {
3-
"module": "commonjs",
4-
"target": "es2017",
5-
"moduleResolution": "node",
3+
"module": "NodeNext",
4+
"target": "ESNext",
5+
"moduleResolution": "NodeNext",
66
"declaration": true,
77
"outDir": "./dist",
88
"esModuleInterop": true,

‎yarn.lock

+945-1,205
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)
Please sign in to comment.