Ứng dụng web sử dụng DynamoDB, Typescript, Express, Generic repository pattern…(Phần 03) – Movie Entity
Đây là bài viết thuộc phần 3 của series. Tới bài viết này chúng ta sẽ tạo ra Entity class cho đối tượng Movies. Entity class này sẽ là đại diện cho đối tượng Movies trong cơ sở dữ liệu, nó cũng là dữ liệu liệu được truyền từ tầng Service tới tầng Repository.
Data Transfer Object(DTO)
Data Transfer Object Pattern là một dạng Architectural Design Pattern, được sử dụng khi chúng ta muốn truyền dữ liệu qua lại giữa các tầng trong ứng dụng, có thể là trao đổi dữ liệu 2 chiều giữa client và server.
Việc sử dụng đối tượng này, giúp làm việc với các dữ liệu “thô” như json, text, xml...
thuận tiện và dễ dàng hơn. Đặc biệt là đối với các ngôn ngữ “strong-types” như Typescript.
Dữ liệu thô chúng ta phải xử lý ở đây là một json object, object này chứa thông tin của một movie:
{ "year": 2013, "title": "Rush", "info": { "directors": [ "Ron Howard" ], "release_date": "2013-09-02T00:00:00Z", "rating": 8.3, "genres": [ "Action", "Biography", "Drama", "Sport" ], "image_url": "http://ia.media-imdb.com/images/M/MV5BMTQyMDE0MTY0OV5BMl5BanBnXkFtZTcwMjI2OTI0OQ@@._V1_SX400_.jpg", "plot": "A re-creation of the merciless 1970s rivalry between Formula One rivals James Hunt and Niki Lauda.", "rank": 2, "running_time_secs": 7380, "actors": [ "Daniel Bruhl", "Chris Hemsworth", "Olivia Wilde" ] } }
Trước tiên, chúng ta sẽ định nghĩa một vài kiểu dữ liệu sẽ được dùng lại nhiều lần như: GenreType, ActorType, DirectorType
(chúng ta không có đối tượng actor hay director, nên kiểu của những đối tượng này sẽ được định nghĩa ở đây).
Tạo file src/entities/types.ts
export type GenreType = 'Action' |'Adventure' |'Animation' |'Biography' |'Comedy' |'Crime' |'Documentary' |'Drama' |'Family' |'Fantasy' |'Film Noir' |'History' |'Horror' |'Music' |'Musical' |'Mystery' |'Romance' |'Sci-Fi' |'Short Film' |'Sport' |'Superhero' |'Thriller' |'War' |'Wester'; export type ActorType = string; export type DirectorType = string;
File này sẽ định nghĩa những kiểu dữ liệu được dùng bởi các Entity.
Chúng ta có phần info cũng là một json object, nên trước tiên chúng ta sẽ tạo ra một DTO class để định nghĩa phần info, src/entities/MovieInfoDTO.ts :
/* tslint:disable:variable-name */ import { ActorType, DirectorType, GenreType } from './types'; export class MovieInfoDTO { public actors?: ActorType[]; public release_date?: string; public plot?: string; public genres?: GenreType[]; public image_url?: string; public directors?: DirectorType[]; public rating?: number; public rank?: number; public running_time_secs?: number; }
Chú ý: Nếu gặp lỗi "property initialization"
, chúng ta sẽ thêm một setting vào file tsconfig.json
"strictPropertyInitialization": false
Tiếp theo, chúng ta tạo DTO entity cho đối tượng Movie, src/entities/MovieDTO.ts :
import { MovieInfoDTO } from './MovieInfoDTO'; export class MovieDTO { public title: string; public year: number; public info?: MovieInfoDTO; }
Entity class
Đối tượng này sẽ giúp chúng ta làm việc với đối tượng Movie: src/entities/Movie.ts
import { MovieDTO } from './MovieDTO'; import { ActorType } from './types'; export class Movie extends MovieDTO { constructor(movieData: MovieDTO) { super(); Object.assign(this, movieData); } /** * Get list actors of movie * @returns {ActorType[]} */ public getActors(): ActorType[] { return this.info?.actors ? this.info.actors : []; } }
Đối tượng Movie extend đối tượng MovieDTO, vì thế nó có tất cả các property của của MovieDTO.
Hơn thế nữa, việc sử dụng entity class giúp chúng ta thao tác với dữ liệu tốt hơn. Ví dụ, thông tin info hay info.actors
của đối tượng là thông tin không bắt buộc, có một công việc chúng ta sẽ luôn phải làm khi muốn lấy ra thông tin actors: Kiểm tra có thông tin hay không trước khi lấy ra.
Với đối tượng này, chúng ta có phương thức getActors
, mục đích là để lấy danh sách các diễn viên tham gia bộ phim. Lúc nào phương thức này cũng trả lại dữ liệu là một mảng, bạn không cần quan tâm tới việc check kết quả của phương thức là null hay không.
Tương tự cho những trường hợp khác, khi bạn muốn lấy hay muốn set dữ liệu (get set
), entity là nơi bạn có thể tin cậy để làm việc với dữ liệu.
Kết thúc phần 03
Tổng kết phần này: Chúng ta tạo ra các đối tượng DTO, Entity class cho đối tượng Movie. Tại sao nên dùng chúng.
Ở phần tiếp theo, chúng ta sẽ xây dựng lớp BaseRepository
. Bằng việc kết hợp với các lớp Entity ở trên, chúng ta sẽ có thể thao tác được với cơ sở dữ liệu.
Đây là những gì được thêm vào, thay đổi so với Phần 02: Commit
Đây là project sau khi kết thúc phần 03: Github