diff options
-rw-r--r-- | client/src/app/shared/users/user.model.ts | 7 | ||||
-rw-r--r-- | client/src/app/videos/shared/video.model.ts | 21 | ||||
-rw-r--r-- | client/src/app/videos/video-list/video-miniature.component.html | 2 | ||||
-rw-r--r-- | server/middlewares/validators/videos.ts | 4 | ||||
-rw-r--r-- | server/models/user.ts | 2 | ||||
-rw-r--r-- | server/models/video.ts | 4 | ||||
-rw-r--r-- | shared/models/user.model.ts | 2 | ||||
-rw-r--r-- | shared/models/video.model.ts | 22 | ||||
-rw-r--r-- | support/doc/client/code.md | 22 | ||||
-rw-r--r-- | 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 @@ | |||
1 | export class User { | 1 | import { User as UserServerModel } from '../../../../../shared'; |
2 | |||
3 | export class User implements UserServerModel { | ||
2 | id: number; | 4 | id: number; |
3 | username: string; | 5 | username: string; |
6 | email: string; | ||
4 | role: string; | 7 | role: string; |
5 | displayNSFW: boolean; | 8 | displayNSFW: boolean; |
6 | createdAt: Date; | 9 | createdAt: Date; |
@@ -8,12 +11,14 @@ export class User { | |||
8 | constructor(hash: { | 11 | constructor(hash: { |
9 | id: number, | 12 | id: number, |
10 | username: string, | 13 | username: string, |
14 | email: string, | ||
11 | role: string, | 15 | role: string, |
12 | displayNSFW?: boolean, | 16 | displayNSFW?: boolean, |
13 | createdAt?: Date, | 17 | createdAt?: Date, |
14 | }) { | 18 | }) { |
15 | this.id = hash.id; | 19 | this.id = hash.id; |
16 | this.username = hash.username; | 20 | this.username = hash.username; |
21 | this.email = hash.email; | ||
17 | this.role = hash.role; | 22 | this.role = hash.role; |
18 | this.displayNSFW = hash.displayNSFW; | 23 | this.displayNSFW = hash.displayNSFW; |
19 | 24 | ||
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 @@ | |||
1 | import { Video as VideoServerModel } from '../../../../../shared'; | ||
1 | import { User } from '../../shared'; | 2 | import { User } from '../../shared'; |
2 | 3 | ||
3 | export class Video { | 4 | export class Video implements VideoServerModel { |
4 | author: string; | 5 | author: string; |
5 | by: string; | 6 | by: string; |
6 | createdAt: Date; | 7 | createdAt: Date; |
7 | categoryLabel: string; | 8 | categoryLabel: string; |
8 | category: string; | 9 | category: number; |
9 | licenceLabel: string; | 10 | licenceLabel: string; |
10 | licence: string; | 11 | licence: number; |
11 | languageLabel: string; | 12 | languageLabel: string; |
12 | language: string; | 13 | language: number; |
13 | description: string; | 14 | description: string; |
14 | duration: string; | 15 | duration: number; |
16 | durationLabel: string; | ||
15 | id: string; | 17 | id: string; |
16 | isLocal: boolean; | 18 | isLocal: boolean; |
17 | magnetUri: string; | 19 | magnetUri: string; |
@@ -41,11 +43,11 @@ export class Video { | |||
41 | author: string, | 43 | author: string, |
42 | createdAt: string, | 44 | createdAt: string, |
43 | categoryLabel: string, | 45 | categoryLabel: string, |
44 | category: string, | 46 | category: number, |
45 | licenceLabel: string, | 47 | licenceLabel: string, |
46 | licence: string, | 48 | licence: number, |
47 | languageLabel: string; | 49 | languageLabel: string; |
48 | language: string; | 50 | language: number; |
49 | description: string, | 51 | description: string, |
50 | duration: number; | 52 | duration: number; |
51 | id: string, | 53 | id: string, |
@@ -69,7 +71,8 @@ export class Video { | |||
69 | this.languageLabel = hash.languageLabel; | 71 | this.languageLabel = hash.languageLabel; |
70 | this.language = hash.language; | 72 | this.language = hash.language; |
71 | this.description = hash.description; | 73 | this.description = hash.description; |
72 | this.duration = Video.createDurationString(hash.duration); | 74 | this.duration = hash.duration; |
75 | this.durationLabel = Video.createDurationString(hash.duration); | ||
73 | this.id = hash.id; | 76 | this.id = hash.id; |
74 | this.isLocal = hash.isLocal; | 77 | this.isLocal = hash.isLocal; |
75 | this.magnetUri = hash.magnetUri; | 78 | 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 @@ | |||
10 | 10 | ||
11 | <div class="video-miniature-thumbnail-overlay"> | 11 | <div class="video-miniature-thumbnail-overlay"> |
12 | <span class="video-miniature-thumbnail-overlay-views">{{ video.views }} views</span> | 12 | <span class="video-miniature-thumbnail-overlay-views">{{ video.views }} views</span> |
13 | <span class="video-miniature-thumbnail-overlay-duration">{{ video.duration }}</span> | 13 | <span class="video-miniature-thumbnail-overlay-duration">{{ video.durationLabel }}</span> |
14 | </div> | 14 | </div> |
15 | </a> | 15 | </a> |
16 | 16 | ||
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' | |||
8 | import { logger, isVideoDurationValid } from '../../helpers' | 8 | import { logger, isVideoDurationValid } from '../../helpers' |
9 | 9 | ||
10 | function videosAddValidator (req: express.Request, res: express.Response, next: express.NextFunction) { | 10 | function videosAddValidator (req: express.Request, res: express.Response, next: express.NextFunction) { |
11 | req.checkBody('videofile', 'Should have a valid file').isVideoFile(req.files) | 11 | // FIXME: Don't write an error message, it seems there is a bug with express-validator |
12 | // 'Should have a valid file' | ||
13 | req.checkBody('videofile').isVideoFile(req.files) | ||
12 | req.checkBody('name', 'Should have a valid name').isVideoNameValid() | 14 | req.checkBody('name', 'Should have a valid name').isVideoNameValid() |
13 | req.checkBody('category', 'Should have a valid category').isVideoCategoryValid() | 15 | req.checkBody('category', 'Should have a valid category').isVideoCategoryValid() |
14 | req.checkBody('licence', 'Should have a valid licence').isVideoLicenceValid() | 16 | 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 | |||
135 | return comparePassword(password, this.password, callback) | 135 | return comparePassword(password, this.password, callback) |
136 | } | 136 | } |
137 | 137 | ||
138 | toFormatedJSON = function () { | 138 | toFormatedJSON = function (this: UserInstance) { |
139 | return { | 139 | return { |
140 | id: this.id, | 140 | id: this.id, |
141 | username: this.username, | 141 | 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 () { | |||
447 | return this.remoteId === null | 447 | return this.remoteId === null |
448 | } | 448 | } |
449 | 449 | ||
450 | toFormatedJSON = function () { | 450 | toFormatedJSON = function (this: VideoInstance) { |
451 | let podHost | 451 | let podHost |
452 | 452 | ||
453 | if (this.Author.Pod) { | 453 | if (this.Author.Pod) { |
@@ -488,7 +488,7 @@ toFormatedJSON = function () { | |||
488 | views: this.views, | 488 | views: this.views, |
489 | likes: this.likes, | 489 | likes: this.likes, |
490 | dislikes: this.dislikes, | 490 | dislikes: this.dislikes, |
491 | tags: map(this.Tags, 'name'), | 491 | tags: map<VideoTagInstance, string>(this.Tags, 'name'), |
492 | thumbnailPath: join(STATIC_PATHS.THUMBNAILS, this.getThumbnailName()), | 492 | thumbnailPath: join(STATIC_PATHS.THUMBNAILS, this.getThumbnailName()), |
493 | createdAt: this.createdAt, | 493 | createdAt: this.createdAt, |
494 | updatedAt: this.updatedAt | 494 | 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 { | |||
3 | username: string | 3 | username: string |
4 | email: string | 4 | email: string |
5 | displayNSFW: boolean | 5 | displayNSFW: boolean |
6 | role: string[] | 6 | role: string |
7 | createdAt: Date | 7 | createdAt: Date |
8 | } | 8 | } |
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 @@ | |||
1 | export interface Video { | 1 | export interface Video { |
2 | 2 | id: string | |
3 | author: string | ||
4 | createdAt: Date | ||
5 | categoryLabel: string | ||
6 | category: number | ||
7 | licenceLabel: string | ||
8 | licence: number | ||
9 | languageLabel: string | ||
10 | language: number | ||
11 | description: string | ||
12 | duration: number | ||
13 | isLocal: boolean | ||
14 | magnetUri: string | ||
15 | name: string | ||
16 | podHost: string | ||
17 | tags: string[] | ||
18 | thumbnailPath: string | ||
19 | views: number | ||
20 | likes: number | ||
21 | dislikes: number | ||
22 | nsfw: boolean | ||
3 | } | 23 | } |
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 @@ | |||
1 | # Client code documentation | 1 | # Client code documentation |
2 | 2 | ||
3 | 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/). | 3 | The client is a HTML/CSS/JavaScript web application (single page application -> SPA) developed with [TypeScript](https://www.typescriptlang.org/)/[Angular](https://angular.io/). |
4 | 4 | ||
5 | 5 | ||
6 | ## Technologies | 6 | ## Technologies |
7 | 7 | ||
8 | * [TypeScript](https://www.typescriptlang.org/) -> Language | 8 | * [TypeScript](https://www.typescriptlang.org/) -> Language |
9 | * [Angular 2](https://angular.io) -> JavaScript framework | 9 | * [Angular](https://angular.io) -> JavaScript framework |
10 | * [SASS](http://sass-lang.com/) -> CSS framework | 10 | * [SASS](http://sass-lang.com/) -> CSS framework |
11 | * [Webpack 2](https://webpack.github.io/docs/) -> Source builder (compile TypeScript, SASS files, bundle them...) | 11 | * [Webpack](https://webpack.github.io/docs/) -> Source builder (compile TypeScript, SASS files, bundle them...) |
12 | * [Bootstrap](http://getbootstrap.com/) -> CSS framework | 12 | * [Bootstrap](http://getbootstrap.com/) -> CSS framework |
13 | * [WebTorrent](https://webtorrent.io/) -> JavaScript library to make P2P in the browser | 13 | * [WebTorrent](https://webtorrent.io/) -> JavaScript library to make P2P in the browser |
14 | * [VideoJS](http://videojs.com/) -> JavaScript player framework | 14 | * [VideoJS](http://videojs.com/) -> JavaScript player framework |
@@ -25,16 +25,16 @@ Here is the description of the useful `client` files directory: | |||
25 | .bootstraprc -> Bootstrap configuration file (which module we need) | 25 | .bootstraprc -> Bootstrap configuration file (which module we need) |
26 | config -> Webpack configuration files | 26 | config -> Webpack configuration files |
27 | src | 27 | src |
28 | |__ app -> TypeScript files for Angular 2 application | 28 | |__ app -> TypeScript files for Angular application |
29 | |__ assets -> static files (images...) | 29 | |__ assets -> static files (images...) |
30 | |__ sass -> SASS files that are global for the application | 30 | |__ sass -> SASS files that are global for the application |
31 | |__ standalone -> files outside the Angular application (embed HTML page...) | 31 | |__ standalone -> files outside the Angular application (embed HTML page...) |
32 | |__ index.html -> root HTML file for our Angular 2 application | 32 | |__ index.html -> root HTML file for our Angular application |
33 | |__ main.ts -> Main TypeScript file that boostraps our Angular 2 application | 33 | |__ main.ts -> Main TypeScript file that boostraps our Angular application |
34 | |__ polyfills.ts -> Polyfills imports (ES 2015...) | 34 | |__ polyfills.ts -> Polyfills imports (ES 2015...) |
35 | |__ vendor.ts -> Vendor imports (Angular, Bootstrap...) | 35 | |__ vendor.ts -> Vendor imports (Angular, Bootstrap...) |
36 | 36 | ||
37 | 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). | 37 | 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). |
38 | 38 | ||
39 | app | 39 | app |
40 | |__ account -> Account components (password change...) | 40 | |__ account -> Account components (password change...) |
@@ -44,11 +44,11 @@ Details of the Angular 2 application file structure. It tries to follow [the off | |||
44 | |__ shared -> Shared components/services (search component, REST services...) | 44 | |__ shared -> Shared components/services (search component, REST services...) |
45 | |__ videos -> Video components (list, watch, upload...) | 45 | |__ videos -> Video components (list, watch, upload...) |
46 | |__ app.component.{html,scss,ts} -> Main application component | 46 | |__ app.component.{html,scss,ts} -> Main application component |
47 | |__ app.module.ts -> Angular 2 root module that imports all submodules we need | 47 | |__ app.module.ts -> Angular root module that imports all submodules we need |
48 | 48 | ||
49 | ## Conventions | 49 | ## Conventions |
50 | 50 | ||
51 | Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [Angular 2 styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). | 51 | Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [Angular styleguide](https://angular.io/docs/ts/latest/guide/style-guide.html). |
52 | 52 | ||
53 | ## Developing | 53 | ## Developing |
54 | 54 | ||
@@ -57,8 +57,8 @@ Uses [TSLint](https://palantir.github.io/tslint/) for TypeScript linting and [An | |||
57 | * Run PostgreSQL and create the database `peertube_dev`. | 57 | * Run PostgreSQL and create the database `peertube_dev`. |
58 | * 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. | 58 | * 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. |
59 | 59 | ||
60 | 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. | 60 | 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. |
61 | If you are not familiar with Angular 2 I recommend you to read the [quickstart guide](https://angular.io/docs/ts/latest/quickstart.html). | 61 | If you are not familiar with Angular I recommend you to read the [quickstart guide](https://angular.io/docs/ts/latest/quickstart.html). |
62 | 62 | ||
63 | ## Components tree | 63 | ## Components tree |
64 | 64 | ||
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 @@ | |||
1 | # Server code documentation | 1 | # Server code documentation |
2 | 2 | ||
3 | The server is a web server developed with [NodeJS](https://nodejs.org)/[Express](http://expressjs.com). | 3 | The server is a web server developed with [TypeScript](https://www.typescriptlang.org/)/[Express](http://expressjs.com). |
4 | 4 | ||
5 | 5 | ||
6 | ## Technologies | 6 | ## Technologies |
7 | 7 | ||
8 | * [NodeJS](https://nodejs.org) -> Language | 8 | * [TypeScript](https://www.typescriptlang.org/) -> Language |
9 | * [PostgreSQL](https://www.postgresql.org/) -> Database | 9 | * [PostgreSQL](https://www.postgresql.org/) -> Database |
10 | * [Express](http://expressjs.com) -> Web server framework | 10 | * [Express](http://expressjs.com) -> Web server framework |
11 | * [Sequelize](http://docs.sequelizejs.com/en/v3/) -> SQL ORM | 11 | * [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] | |||
15 | 15 | ||
16 | ## Files | 16 | ## Files |
17 | 17 | ||
18 | The server main file is [server.js](https://github.com/Chocobozzz/PeerTube/blob/master/server.js). | 18 | The server main file is [server.ts](https://github.com/Chocobozzz/PeerTube/blob/master/server.ts). |
19 | The server modules description are in the [package.json](https://github.com/Chocobozzz/PeerTube/blob/master/package.json) at the project root. | 19 | The server modules description are in the [package.json](https://github.com/Chocobozzz/PeerTube/blob/master/package.json) at the project root. |
20 | All other server files are in the [server](https://github.com/Chocobozzz/PeerTube/tree/master/server) directory: | 20 | All other server files are in the [server](https://github.com/Chocobozzz/PeerTube/tree/master/server) directory: |
21 | 21 | ||
22 | server.js -> app initilization, main routes configuration (static routes...) | 22 | server.ts -> app initilization, main routes configuration (static routes...) |
23 | config -> server YAML configurations (for tests, production...) | 23 | config -> server YAML configurations (for tests, production...) |
24 | scripts -> Scripts files for npm run | 24 | scripts -> Scripts files for npm run |
25 | server | 25 | server |
@@ -42,9 +42,9 @@ Uses [JavaScript Standard Style](http://standardjs.com/). | |||
42 | * Install [the dependencies](https://github.com/Chocobozzz/PeerTube#dependencies) | 42 | * Install [the dependencies](https://github.com/Chocobozzz/PeerTube#dependencies) |
43 | * Run `npm install` at the root directory to install all the dependencies | 43 | * Run `npm install` at the root directory to install all the dependencies |
44 | * Run PostgreSQL and create the database `peertube_dev`. | 44 | * Run PostgreSQL and create the database `peertube_dev`. |
45 | * 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` | 45 | * 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` |
46 | 46 | ||
47 | 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)). | 47 | 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)). |
48 | 48 | ||
49 | `npm run help` gives you all available commands. | 49 | `npm run help` gives you all available commands. |
50 | 50 | ||
@@ -68,5 +68,5 @@ If a user wants to watch the video, the tracker will indicate all other users th | |||
68 | 68 | ||
69 | ## Newcomers | 69 | ## Newcomers |
70 | 70 | ||
71 | The server entrypoint is [server.js](https://github.com/Chocobozzz/PeerTube/blob/master/server.js). You can begin to look at this file. | 71 | The server entrypoint is [server.ts](https://github.com/Chocobozzz/PeerTube/blob/master/server.ts). You can begin to look at this file. |
72 | 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. | 72 | 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. |