Use shared models
This commit is contained in:
parent
75fb0c0b2e
commit
69f616ab3a
10 changed files with 65 additions and 35 deletions
|
@ -1,6 +1,9 @@
|
||||||
export class User {
|
import { User as UserServerModel } from '../../../../../shared';
|
||||||
|
|
||||||
|
export class User implements UserServerModel {
|
||||||
id: number;
|
id: number;
|
||||||
username: string;
|
username: string;
|
||||||
|
email: string;
|
||||||
role: string;
|
role: string;
|
||||||
displayNSFW: boolean;
|
displayNSFW: boolean;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
|
@ -8,12 +11,14 @@ export class User {
|
||||||
constructor(hash: {
|
constructor(hash: {
|
||||||
id: number,
|
id: number,
|
||||||
username: string,
|
username: string,
|
||||||
|
email: string,
|
||||||
role: string,
|
role: string,
|
||||||
displayNSFW?: boolean,
|
displayNSFW?: boolean,
|
||||||
createdAt?: Date,
|
createdAt?: Date,
|
||||||
}) {
|
}) {
|
||||||
this.id = hash.id;
|
this.id = hash.id;
|
||||||
this.username = hash.username;
|
this.username = hash.username;
|
||||||
|
this.email = hash.email;
|
||||||
this.role = hash.role;
|
this.role = hash.role;
|
||||||
this.displayNSFW = hash.displayNSFW;
|
this.displayNSFW = hash.displayNSFW;
|
||||||
|
|
||||||
|
|
|
@ -1,17 +1,19 @@
|
||||||
|
import { Video as VideoServerModel } from '../../../../../shared';
|
||||||
import { User } from '../../shared';
|
import { User } from '../../shared';
|
||||||
|
|
||||||
export class Video {
|
export class Video implements VideoServerModel {
|
||||||
author: string;
|
author: string;
|
||||||
by: string;
|
by: string;
|
||||||
createdAt: Date;
|
createdAt: Date;
|
||||||
categoryLabel: string;
|
categoryLabel: string;
|
||||||
category: string;
|
category: number;
|
||||||
licenceLabel: string;
|
licenceLabel: string;
|
||||||
licence: string;
|
licence: number;
|
||||||
languageLabel: string;
|
languageLabel: string;
|
||||||
language: string;
|
language: number;
|
||||||
description: string;
|
description: string;
|
||||||
duration: string;
|
duration: number;
|
||||||
|
durationLabel: string;
|
||||||
id: string;
|
id: string;
|
||||||
isLocal: boolean;
|
isLocal: boolean;
|
||||||
magnetUri: string;
|
magnetUri: string;
|
||||||
|
@ -41,11 +43,11 @@ export class Video {
|
||||||
author: string,
|
author: string,
|
||||||
createdAt: string,
|
createdAt: string,
|
||||||
categoryLabel: string,
|
categoryLabel: string,
|
||||||
category: string,
|
category: number,
|
||||||
licenceLabel: string,
|
licenceLabel: string,
|
||||||
licence: string,
|
licence: number,
|
||||||
languageLabel: string;
|
languageLabel: string;
|
||||||
language: string;
|
language: number;
|
||||||
description: string,
|
description: string,
|
||||||
duration: number;
|
duration: number;
|
||||||
id: string,
|
id: string,
|
||||||
|
@ -69,7 +71,8 @@ export class Video {
|
||||||
this.languageLabel = hash.languageLabel;
|
this.languageLabel = hash.languageLabel;
|
||||||
this.language = hash.language;
|
this.language = hash.language;
|
||||||
this.description = hash.description;
|
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.id = hash.id;
|
||||||
this.isLocal = hash.isLocal;
|
this.isLocal = hash.isLocal;
|
||||||
this.magnetUri = hash.magnetUri;
|
this.magnetUri = hash.magnetUri;
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
|
|
||||||
<div class="video-miniature-thumbnail-overlay">
|
<div class="video-miniature-thumbnail-overlay">
|
||||||
<span class="video-miniature-thumbnail-overlay-views">{{ video.views }} views</span>
|
<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>
|
</div>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
|
|
|
@ -8,7 +8,9 @@ import { CONSTRAINTS_FIELDS, SEARCHABLE_COLUMNS } from '../../initializers'
|
||||||
import { logger, isVideoDurationValid } from '../../helpers'
|
import { logger, isVideoDurationValid } from '../../helpers'
|
||||||
|
|
||||||
function videosAddValidator (req: express.Request, res: express.Response, next: express.NextFunction) {
|
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('name', 'Should have a valid name').isVideoNameValid()
|
||||||
req.checkBody('category', 'Should have a valid category').isVideoCategoryValid()
|
req.checkBody('category', 'Should have a valid category').isVideoCategoryValid()
|
||||||
req.checkBody('licence', 'Should have a valid licence').isVideoLicenceValid()
|
req.checkBody('licence', 'Should have a valid licence').isVideoLicenceValid()
|
||||||
|
|
|
@ -135,7 +135,7 @@ isPasswordMatch = function (password: string, callback: UserMethods.IsPasswordMa
|
||||||
return comparePassword(password, this.password, callback)
|
return comparePassword(password, this.password, callback)
|
||||||
}
|
}
|
||||||
|
|
||||||
toFormatedJSON = function () {
|
toFormatedJSON = function (this: UserInstance) {
|
||||||
return {
|
return {
|
||||||
id: this.id,
|
id: this.id,
|
||||||
username: this.username,
|
username: this.username,
|
||||||
|
|
|
@ -447,7 +447,7 @@ isOwned = function () {
|
||||||
return this.remoteId === null
|
return this.remoteId === null
|
||||||
}
|
}
|
||||||
|
|
||||||
toFormatedJSON = function () {
|
toFormatedJSON = function (this: VideoInstance) {
|
||||||
let podHost
|
let podHost
|
||||||
|
|
||||||
if (this.Author.Pod) {
|
if (this.Author.Pod) {
|
||||||
|
@ -488,7 +488,7 @@ toFormatedJSON = function () {
|
||||||
views: this.views,
|
views: this.views,
|
||||||
likes: this.likes,
|
likes: this.likes,
|
||||||
dislikes: this.dislikes,
|
dislikes: this.dislikes,
|
||||||
tags: map(this.Tags, 'name'),
|
tags: map<VideoTagInstance, string>(this.Tags, 'name'),
|
||||||
thumbnailPath: join(STATIC_PATHS.THUMBNAILS, this.getThumbnailName()),
|
thumbnailPath: join(STATIC_PATHS.THUMBNAILS, this.getThumbnailName()),
|
||||||
createdAt: this.createdAt,
|
createdAt: this.createdAt,
|
||||||
updatedAt: this.updatedAt
|
updatedAt: this.updatedAt
|
||||||
|
|
|
@ -3,6 +3,6 @@ export interface User {
|
||||||
username: string
|
username: string
|
||||||
email: string
|
email: string
|
||||||
displayNSFW: boolean
|
displayNSFW: boolean
|
||||||
role: string[]
|
role: string
|
||||||
createdAt: Date
|
createdAt: Date
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,23 @@
|
||||||
export interface Video {
|
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
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,14 +1,14 @@
|
||||||
# Client code documentation
|
# 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
|
## Technologies
|
||||||
|
|
||||||
* [TypeScript](https://www.typescriptlang.org/) -> Language
|
* [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
|
* [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
|
* [Bootstrap](http://getbootstrap.com/) -> CSS framework
|
||||||
* [WebTorrent](https://webtorrent.io/) -> JavaScript library to make P2P in the browser
|
* [WebTorrent](https://webtorrent.io/) -> JavaScript library to make P2P in the browser
|
||||||
* [VideoJS](http://videojs.com/) -> JavaScript player framework
|
* [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)
|
.bootstraprc -> Bootstrap configuration file (which module we need)
|
||||||
config -> Webpack configuration files
|
config -> Webpack configuration files
|
||||||
src
|
src
|
||||||
|__ app -> TypeScript files for Angular 2 application
|
|__ app -> TypeScript files for Angular application
|
||||||
|__ assets -> static files (images...)
|
|__ assets -> static files (images...)
|
||||||
|__ sass -> SASS files that are global for the application
|
|__ sass -> SASS files that are global for the application
|
||||||
|__ standalone -> files outside the Angular application (embed HTML page...)
|
|__ standalone -> files outside the Angular application (embed HTML page...)
|
||||||
|__ index.html -> root HTML file for our Angular 2 application
|
|__ index.html -> root HTML file for our Angular application
|
||||||
|__ main.ts -> Main TypeScript file that boostraps our Angular 2 application
|
|__ main.ts -> Main TypeScript file that boostraps our Angular application
|
||||||
|__ polyfills.ts -> Polyfills imports (ES 2015...)
|
|__ polyfills.ts -> Polyfills imports (ES 2015...)
|
||||||
|__ vendor.ts -> Vendor imports (Angular, Bootstrap...)
|
|__ 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
|
app
|
||||||
|__ account -> Account components (password change...)
|
|__ 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...)
|
|__ shared -> Shared components/services (search component, REST services...)
|
||||||
|__ videos -> Video components (list, watch, upload...)
|
|__ videos -> Video components (list, watch, upload...)
|
||||||
|__ app.component.{html,scss,ts} -> Main application component
|
|__ 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
|
## 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
|
## 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 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.
|
* 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.
|
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 2 I recommend you to read the [quickstart guide](https://angular.io/docs/ts/latest/quickstart.html).
|
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
|
## Components tree
|
||||||
|
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
# Server code documentation
|
# 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
|
## Technologies
|
||||||
|
|
||||||
* [NodeJS](https://nodejs.org) -> Language
|
* [TypeScript](https://www.typescriptlang.org/) -> Language
|
||||||
* [PostgreSQL](https://www.postgresql.org/) -> Database
|
* [PostgreSQL](https://www.postgresql.org/) -> Database
|
||||||
* [Express](http://expressjs.com) -> Web server framework
|
* [Express](http://expressjs.com) -> Web server framework
|
||||||
* [Sequelize](http://docs.sequelizejs.com/en/v3/) -> SQL ORM
|
* [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
|
## 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.
|
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:
|
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...)
|
config -> server YAML configurations (for tests, production...)
|
||||||
scripts -> Scripts files for npm run
|
scripts -> Scripts files for npm run
|
||||||
server
|
server
|
||||||
|
@ -42,9 +42,9 @@ Uses [JavaScript Standard Style](http://standardjs.com/).
|
||||||
* Install [the dependencies](https://github.com/Chocobozzz/PeerTube#dependencies)
|
* Install [the dependencies](https://github.com/Chocobozzz/PeerTube#dependencies)
|
||||||
* Run `npm install` at the root directory to install all the dependencies
|
* Run `npm install` at the root directory to install all the dependencies
|
||||||
* Run PostgreSQL and create the database `peertube_dev`.
|
* 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.
|
`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
|
## 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.
|
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.
|
||||||
|
|
Loading…
Reference in a new issue