1
0
Fork 0

Use shared models

This commit is contained in:
Chocobozzz 2017-06-11 11:02:35 +02:00
parent 75fb0c0b2e
commit 69f616ab3a
10 changed files with 65 additions and 35 deletions

View file

@ -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;

View file

@ -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;

View file

@ -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>

View file

@ -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()

View file

@ -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,

View file

@ -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

View file

@ -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
} }

View file

@ -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
} }

View file

@ -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

View file

@ -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.