-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;
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;
+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;
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,
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;
<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>
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()
return comparePassword(password, this.password, callback)
}
-toFormatedJSON = function () {
+toFormatedJSON = function (this: UserInstance) {
return {
id: this.id,
username: this.username,
return this.remoteId === null
}
-toFormatedJSON = function () {
+toFormatedJSON = function (this: VideoInstance) {
let podHost
if (this.Author.Pod) {
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
username: string
email: string
displayNSFW: boolean
- role: string[]
+ role: string
createdAt: Date
}
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
}
# 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
.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...)
|__ 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
* 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
# 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
## 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
* 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.
## 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.