Use shared models
authorChocobozzz <florian.bigard@gmail.com>
Sun, 11 Jun 2017 09:02:35 +0000 (11:02 +0200)
committerChocobozzz <florian.bigard@gmail.com>
Sun, 11 Jun 2017 09:02:35 +0000 (11:02 +0200)
client/src/app/shared/users/user.model.ts
client/src/app/videos/shared/video.model.ts
client/src/app/videos/video-list/video-miniature.component.html
server/middlewares/validators/videos.ts
server/models/user.ts
server/models/video.ts
shared/models/user.model.ts
shared/models/video.model.ts
support/doc/client/code.md
support/doc/server/code.md

index f7859f495929ae257c767c76b6f5b0953580b1ad..09722704a3f0ff3dbe94cc9363aba5aa6481087d 100644 (file)
@@ -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;
 
index fafdb4ac4b114548f0692f42b0aee32bd0f5a610..0cf4039df312b5f33a1d354710af7d50747db2a5 100644 (file)
@@ -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;
index 648ef61b1adc0df09991d3d521a8db65d8f49770..b1b881fea3ebf3ca1626a436fd71ec5fcc7d8f2a 100644 (file)
@@ -10,7 +10,7 @@
 
     <div class="video-miniature-thumbnail-overlay">
       <span class="video-miniature-thumbnail-overlay-views">{{ video.views }} views</span>
-      <span class="video-miniature-thumbnail-overlay-duration">{{ video.duration }}</span>
+      <span class="video-miniature-thumbnail-overlay-duration">{{ video.durationLabel }}</span>
     </div>
   </a>
 
index e99cdefb18e37f1d1bdfe82b6c7f9436ff379c7f..03742a522bd8e43be01319216dfe9f1e9a283696 100644 (file)
@@ -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()
index 0fbfdda50e005f92dbea0be10ed3f50fa7a784a2..cd383a16acb90f58c8059a72ce298a660535dd2d 100644 (file)
@@ -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,
index 3f808b811f9d4b63b571d97fa5b62c59ddb98776..2234664f465f1d0a318299cc5507e42a8313cb70 100644 (file)
@@ -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<VideoTagInstance, string>(this.Tags, 'name'),
     thumbnailPath: join(STATIC_PATHS.THUMBNAILS, this.getThumbnailName()),
     createdAt: this.createdAt,
     updatedAt: this.updatedAt
index 01cc380d3c17bc7f233dd21825783416d456d86f..a6be359d3209803a127411d72871a63d44955c5e 100644 (file)
@@ -3,6 +3,6 @@ export interface User {
   username: string
   email: string
   displayNSFW: boolean
-  role: string[]
+  role: string
   createdAt: Date
 }
index 355e912d2e12d665a76e45dac6fb0fee61130721..2e35f005c97d2feab42755a2164f09719565ed14 100644 (file)
@@ -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
 }
index f629af32f10dee93cdb29fc37ec189e7ccb1feff..c1a5c1c5f62737bb2b14a934c4d8e8b138dc8c8e 100644 (file)
@@ -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 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 application
-    |__ main.ts      -> Main TypeScript file that boostraps our Angular 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 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 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 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).
+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
 
index c15885c8c15429738402f31886022a4782b444b7..76d11c963c076f8a22fbe80ea35f10c01ce93499 100644 (file)
@@ -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.