From 69f616ab3aeefd6ce330600604df90f2f48bfe3b Mon Sep 17 00:00:00 2001 From: Chocobozzz Date: Sun, 11 Jun 2017 11:02:35 +0200 Subject: [PATCH] Use shared models --- client/src/app/shared/users/user.model.ts | 7 +++++- client/src/app/videos/shared/video.model.ts | 21 ++++++++++-------- .../video-list/video-miniature.component.html | 2 +- server/middlewares/validators/videos.ts | 4 +++- server/models/user.ts | 2 +- server/models/video.ts | 4 ++-- shared/models/user.model.ts | 2 +- shared/models/video.model.ts | 22 ++++++++++++++++++- support/doc/client/code.md | 22 +++++++++---------- support/doc/server/code.md | 14 ++++++------ 10 files changed, 65 insertions(+), 35 deletions(-) diff --git a/client/src/app/shared/users/user.model.ts b/client/src/app/shared/users/user.model.ts index f7859f495..09722704a 100644 --- a/client/src/app/shared/users/user.model.ts +++ b/client/src/app/shared/users/user.model.ts @@ -1,6 +1,9 @@ -export class User { +import { User as UserServerModel } from '../../../../../shared'; + +export class User implements UserServerModel { id: number; username: string; + email: string; role: string; displayNSFW: boolean; createdAt: Date; @@ -8,12 +11,14 @@ export class User { constructor(hash: { id: number, username: string, + email: string, role: string, displayNSFW?: boolean, createdAt?: Date, }) { this.id = hash.id; this.username = hash.username; + this.email = hash.email; this.role = hash.role; this.displayNSFW = hash.displayNSFW; diff --git a/client/src/app/videos/shared/video.model.ts b/client/src/app/videos/shared/video.model.ts index fafdb4ac4..0cf4039df 100644 --- a/client/src/app/videos/shared/video.model.ts +++ b/client/src/app/videos/shared/video.model.ts @@ -1,17 +1,19 @@ +import { Video as VideoServerModel } from '../../../../../shared'; import { User } from '../../shared'; -export class Video { +export class Video implements VideoServerModel { author: string; by: string; createdAt: Date; categoryLabel: string; - category: string; + category: number; licenceLabel: string; - licence: string; + licence: number; languageLabel: string; - language: string; + language: number; description: string; - duration: string; + duration: number; + durationLabel: string; id: string; isLocal: boolean; magnetUri: string; @@ -41,11 +43,11 @@ export class Video { author: string, createdAt: string, categoryLabel: string, - category: string, + category: number, licenceLabel: string, - licence: string, + licence: number, languageLabel: string; - language: string; + language: number; description: string, duration: number; id: string, @@ -69,7 +71,8 @@ export class Video { this.languageLabel = hash.languageLabel; this.language = hash.language; this.description = hash.description; - this.duration = Video.createDurationString(hash.duration); + this.duration = hash.duration; + this.durationLabel = Video.createDurationString(hash.duration); this.id = hash.id; this.isLocal = hash.isLocal; this.magnetUri = hash.magnetUri; diff --git a/client/src/app/videos/video-list/video-miniature.component.html b/client/src/app/videos/video-list/video-miniature.component.html index 648ef61b1..b1b881fea 100644 --- a/client/src/app/videos/video-list/video-miniature.component.html +++ b/client/src/app/videos/video-list/video-miniature.component.html @@ -10,7 +10,7 @@
{{ video.views }} views - {{ video.duration }} + {{ video.durationLabel }}
diff --git a/server/middlewares/validators/videos.ts b/server/middlewares/validators/videos.ts index e99cdefb1..03742a522 100644 --- a/server/middlewares/validators/videos.ts +++ b/server/middlewares/validators/videos.ts @@ -8,7 +8,9 @@ import { CONSTRAINTS_FIELDS, SEARCHABLE_COLUMNS } from '../../initializers' import { logger, isVideoDurationValid } from '../../helpers' function videosAddValidator (req: express.Request, res: express.Response, next: express.NextFunction) { - req.checkBody('videofile', 'Should have a valid file').isVideoFile(req.files) + // FIXME: Don't write an error message, it seems there is a bug with express-validator + // 'Should have a valid file' + req.checkBody('videofile').isVideoFile(req.files) req.checkBody('name', 'Should have a valid name').isVideoNameValid() req.checkBody('category', 'Should have a valid category').isVideoCategoryValid() req.checkBody('licence', 'Should have a valid licence').isVideoLicenceValid() diff --git a/server/models/user.ts b/server/models/user.ts index 0fbfdda50..cd383a16a 100644 --- a/server/models/user.ts +++ b/server/models/user.ts @@ -135,7 +135,7 @@ isPasswordMatch = function (password: string, callback: UserMethods.IsPasswordMa return comparePassword(password, this.password, callback) } -toFormatedJSON = function () { +toFormatedJSON = function (this: UserInstance) { return { id: this.id, username: this.username, diff --git a/server/models/video.ts b/server/models/video.ts index 3f808b811..2234664f4 100644 --- a/server/models/video.ts +++ b/server/models/video.ts @@ -447,7 +447,7 @@ isOwned = function () { return this.remoteId === null } -toFormatedJSON = function () { +toFormatedJSON = function (this: VideoInstance) { let podHost if (this.Author.Pod) { @@ -488,7 +488,7 @@ toFormatedJSON = function () { views: this.views, likes: this.likes, dislikes: this.dislikes, - tags: map(this.Tags, 'name'), + tags: map(this.Tags, 'name'), thumbnailPath: join(STATIC_PATHS.THUMBNAILS, this.getThumbnailName()), createdAt: this.createdAt, updatedAt: this.updatedAt diff --git a/shared/models/user.model.ts b/shared/models/user.model.ts index 01cc380d3..a6be359d3 100644 --- a/shared/models/user.model.ts +++ b/shared/models/user.model.ts @@ -3,6 +3,6 @@ export interface User { username: string email: string displayNSFW: boolean - role: string[] + role: string createdAt: Date } diff --git a/shared/models/video.model.ts b/shared/models/video.model.ts index 355e912d2..2e35f005c 100644 --- a/shared/models/video.model.ts +++ b/shared/models/video.model.ts @@ -1,3 +1,23 @@ export interface Video { - + id: string + author: string + createdAt: Date + categoryLabel: string + category: number + licenceLabel: string + licence: number + languageLabel: string + language: number + description: string + duration: number + isLocal: boolean + magnetUri: string + name: string + podHost: string + tags: string[] + thumbnailPath: string + views: number + likes: number + dislikes: number + nsfw: boolean } diff --git a/support/doc/client/code.md b/support/doc/client/code.md index f629af32f..c1a5c1c5f 100644 --- a/support/doc/client/code.md +++ b/support/doc/client/code.md @@ -1,14 +1,14 @@ # Client code documentation -The client is a HTML/CSS/JavaScript web application (single page application -> SPA) developed with [TypeScript](https://www.typescriptlang.org/)/[Angular 2](https://angular.io/). +The client is a HTML/CSS/JavaScript web application (single page application -> SPA) developed with [TypeScript](https://www.typescriptlang.org/)/[Angular](https://angular.io/). ## Technologies * [TypeScript](https://www.typescriptlang.org/) -> Language - * [Angular 2](https://angular.io) -> JavaScript framework + * [Angular](https://angular.io) -> JavaScript framework * [SASS](http://sass-lang.com/) -> CSS framework - * [Webpack 2](https://webpack.github.io/docs/) -> Source builder (compile TypeScript, SASS files, bundle them...) + * [Webpack](https://webpack.github.io/docs/) -> Source builder (compile TypeScript, SASS files, bundle them...) * [Bootstrap](http://getbootstrap.com/) -> CSS framework * [WebTorrent](https://webtorrent.io/) -> JavaScript library to make P2P in the browser * [VideoJS](http://videojs.com/) -> JavaScript player framework @@ -25,16 +25,16 @@ Here is the description of the useful `client` files directory: .bootstraprc -> Bootstrap configuration file (which module we need) config -> Webpack configuration files src - |__ app -> TypeScript files for Angular 2 application + |__ app -> TypeScript files for Angular application |__ assets -> static files (images...) |__ sass -> SASS files that are global for the application |__ standalone -> files outside the Angular application (embed HTML page...) - |__ index.html -> root HTML file for our Angular 2 application - |__ main.ts -> Main TypeScript file that boostraps our Angular 2 application + |__ index.html -> root HTML file for our Angular application + |__ main.ts -> Main TypeScript file that boostraps our Angular application |__ polyfills.ts -> Polyfills imports (ES 2015...) |__ vendor.ts -> Vendor imports (Angular, Bootstrap...) -Details of the Angular 2 application file structure. It tries to follow [the official Angular 2 styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). +Details of the Angular application file structure. It tries to follow [the official Angular styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). app |__ account -> Account components (password change...) @@ -44,11 +44,11 @@ Details of the Angular 2 application file structure. It tries to follow [the off |__ shared -> Shared components/services (search component, REST services...) |__ videos -> Video components (list, watch, upload...) |__ app.component.{html,scss,ts} -> Main application component - |__ app.module.ts -> Angular 2 root module that imports all submodules we need + |__ app.module.ts -> Angular root module that imports all submodules we need ## Conventions -Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [Angular 2 styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). +Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [Angular styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). ## Developing @@ -57,8 +57,8 @@ Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [An * Run PostgreSQL and create the database `peertube_dev`. * Run `npm run dev` to compile the client and automatically run the server. Then the server will watch and compile the client files automatically. You just need to refresh the browser to see your modifications. -In a Angular 2 application, we create components that we put together. Each component is defined by an HTML structure, a TypeScript file and optionnaly a SASS file. -If you are not familiar with Angular 2 I recommend you to read the [quickstart guide](https://angular.io/docs/ts/latest/quickstart.html). +In a Angular application, we create components that we put together. Each component is defined by an HTML structure, a TypeScript file and optionnaly a SASS file. +If you are not familiar with Angular I recommend you to read the [quickstart guide](https://angular.io/docs/ts/latest/quickstart.html). ## Components tree diff --git a/support/doc/server/code.md b/support/doc/server/code.md index c15885c8c..76d11c963 100644 --- a/support/doc/server/code.md +++ b/support/doc/server/code.md @@ -1,11 +1,11 @@ # Server code documentation -The server is a web server developed with [NodeJS](https://nodejs.org)/[Express](http://expressjs.com). +The server is a web server developed with [TypeScript](https://www.typescriptlang.org/)/[Express](http://expressjs.com). ## Technologies - * [NodeJS](https://nodejs.org) -> Language + * [TypeScript](https://www.typescriptlang.org/) -> Language * [PostgreSQL](https://www.postgresql.org/) -> Database * [Express](http://expressjs.com) -> Web server framework * [Sequelize](http://docs.sequelizejs.com/en/v3/) -> SQL ORM @@ -15,11 +15,11 @@ The server is a web server developed with [NodeJS](https://nodejs.org)/[Express] ## Files -The server main file is [server.js](https://github.com/Chocobozzz/PeerTube/blob/master/server.js). +The server main file is [server.ts](https://github.com/Chocobozzz/PeerTube/blob/master/server.ts). The server modules description are in the [package.json](https://github.com/Chocobozzz/PeerTube/blob/master/package.json) at the project root. All other server files are in the [server](https://github.com/Chocobozzz/PeerTube/tree/master/server) directory: - server.js -> app initilization, main routes configuration (static routes...) + server.ts -> app initilization, main routes configuration (static routes...) config -> server YAML configurations (for tests, production...) scripts -> Scripts files for npm run server @@ -42,9 +42,9 @@ Uses [JavaScript Standard Style](http://standardjs.com/). * Install [the dependencies](https://github.com/Chocobozzz/PeerTube#dependencies) * Run `npm install` at the root directory to install all the dependencies * Run PostgreSQL and create the database `peertube_dev`. - * Run `npm run dev` to compile the client and automatically run the server. If the client files are already compiled you can simply run `NODE_ENV=test node server` + * Run `npm run dev` to compile the client and automatically run the server. If the client files are already compiled you can simply run `NODE_ENV=test node dist/server` -The `NODE_ENV=test` is set to speed up communications between pods (see [constants.js](https://github.com/Chocobozzz/PeerTube/blob/master/server/initializers/constants.js)). +The `NODE_ENV=test` is set to speed up communications between pods (see [constants.ts](https://github.com/Chocobozzz/PeerTube/blob/master/server/initializers/constants.ts)). `npm run help` gives you all available commands. @@ -68,5 +68,5 @@ If a user wants to watch the video, the tracker will indicate all other users th ## Newcomers -The server entrypoint is [server.js](https://github.com/Chocobozzz/PeerTube/blob/master/server.js). You can begin to look at this file. +The server entrypoint is [server.ts](https://github.com/Chocobozzz/PeerTube/blob/master/server.ts). You can begin to look at this file. Then you can try to understand the [controllers](https://github.com/Chocobozzz/PeerTube/tree/master/server/controllers): they are the entrypoint of each API request.