From: Chocobozzz Date: Sat, 17 Jun 2017 09:28:11 +0000 (+0200) Subject: Share models between server and client X-Git-Tag: v0.0.1-alpha~404 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=154898b0b7bc1af41fc5a94974e338a3590c90f3;p=oweals%2Fpeertube.git Share models between server and client --- diff --git a/client/src/app/+admin/friends/friend-list/friend-list.component.ts b/client/src/app/+admin/friends/friend-list/friend-list.component.ts index 7bf9d2c6b..9f0256d7f 100644 --- a/client/src/app/+admin/friends/friend-list/friend-list.component.ts +++ b/client/src/app/+admin/friends/friend-list/friend-list.component.ts @@ -5,7 +5,7 @@ import { ServerDataSource } from 'ng2-smart-table' import { ConfirmService } from '../../../core' import { Utils } from '../../../shared' -import { Friend, FriendService } from '../shared' +import { FriendService } from '../shared' @Component({ selector: 'my-friend-list', diff --git a/client/src/app/+admin/friends/shared/friend.model.ts b/client/src/app/+admin/friends/shared/friend.model.ts deleted file mode 100644 index 6950405b9..000000000 --- a/client/src/app/+admin/friends/shared/friend.model.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface Friend { - id: string - host: string - score: number - email: string - createdAt: Date -} diff --git a/client/src/app/+admin/friends/shared/friend.service.ts b/client/src/app/+admin/friends/shared/friend.service.ts index f4ecd36ad..79de4470e 100644 --- a/client/src/app/+admin/friends/shared/friend.service.ts +++ b/client/src/app/+admin/friends/shared/friend.service.ts @@ -5,7 +5,6 @@ import 'rxjs/add/operator/map' import { ServerDataSource } from 'ng2-smart-table' -import { Friend } from './friend.model' import { AuthHttp, RestExtractor, RestDataSource, ResultList } from '../../../shared' @Injectable() diff --git a/client/src/app/+admin/requests/request-stats/request-stats.component.ts b/client/src/app/+admin/requests/request-stats/request-stats.component.ts index cca4926cf..140aaf47e 100644 --- a/client/src/app/+admin/requests/request-stats/request-stats.component.ts +++ b/client/src/app/+admin/requests/request-stats/request-stats.component.ts @@ -2,7 +2,8 @@ import { Component, OnInit, OnDestroy } from '@angular/core' import { NotificationsService } from 'angular2-notifications' -import { RequestService, RequestStats } from '../shared' +import { RequestService, RequestSchedulerStatsAttributes } from '../shared' +import { RequestScheduler } from '../../../../../../shared' @Component({ selector: 'my-request-stats', @@ -16,11 +17,7 @@ export class RequestStatsComponent implements OnInit, OnDestroy { requestVideoQaduScheduler: 'Quick and dirty video updates request scheduler' } - stats: { [ id: string ]: RequestStats } = { - requestScheduler: null, - requestVideoEventScheduler: null, - requestVideoQaduScheduler: null - } + stats: RequestScheduler private intervals: { [ id: string ]: number } = { requestScheduler: null, @@ -67,7 +64,7 @@ export class RequestStatsComponent implements OnInit, OnDestroy { private runIntervals () { Object.keys(this.intervals).forEach(requestSchedulerName => { this.intervals[requestSchedulerName] = window.setInterval(() => { - const stats = this.stats[requestSchedulerName] + const stats: RequestSchedulerStatsAttributes = this.stats[requestSchedulerName] stats.remainingMilliSeconds -= 1000 diff --git a/client/src/app/+admin/requests/shared/index.ts b/client/src/app/+admin/requests/shared/index.ts index 2442e810a..857fe9d29 100644 --- a/client/src/app/+admin/requests/shared/index.ts +++ b/client/src/app/+admin/requests/shared/index.ts @@ -1,2 +1,2 @@ -export * from './request-stats.model' +export * from './request-stats-attributes.model' export * from './request.service' diff --git a/client/src/app/+admin/requests/shared/request-stats-attributes.model.ts b/client/src/app/+admin/requests/shared/request-stats-attributes.model.ts new file mode 100644 index 000000000..394acc73d --- /dev/null +++ b/client/src/app/+admin/requests/shared/request-stats-attributes.model.ts @@ -0,0 +1,37 @@ +import { RequestSchedulerAttributes as FormatedRequestSchedulerAttributes } from '../../../../../../shared' + +export interface Request { + request: any + to: any +} + +export class RequestSchedulerStatsAttributes implements FormatedRequestSchedulerAttributes { + requestsLimitPods: number + requestsLimitPerPod: number + milliSecondsInterval: number + remainingMilliSeconds: number + totalRequests: number + + constructor (hash: { + requestsLimitPods: number, + requestsLimitPerPod: number, + milliSecondsInterval: number, + remainingMilliSeconds: number, + totalRequests: number + }) { + this.requestsLimitPods = hash.requestsLimitPods + this.requestsLimitPerPod = hash.requestsLimitPerPod + this.milliSecondsInterval = hash.milliSecondsInterval + this.remainingMilliSeconds = hash.remainingMilliSeconds + this.totalRequests = hash.totalRequests + } + + get remainingSeconds () { + return Math.floor(this.remainingMilliSeconds / 1000) + } + + get secondsInterva () { + return Math.floor(this.milliSecondsInterval / 1000) + } + +} diff --git a/client/src/app/+admin/requests/shared/request-stats.model.ts b/client/src/app/+admin/requests/shared/request-stats.model.ts deleted file mode 100644 index 31550b5c0..000000000 --- a/client/src/app/+admin/requests/shared/request-stats.model.ts +++ /dev/null @@ -1,35 +0,0 @@ -export interface Request { - request: any - to: any -} - -export class RequestStats { - requestsLimitPods: number - requestsLimitPerPod: number - milliSecondsInterval: number - remainingMilliSeconds: number - totalRequests: number - - constructor (hash: { - requestsLimitPods: number, - requestsLimitPerPod: number, - milliSecondsInterval: number, - remainingMilliSeconds: number, - totalRequests: number - }) { - this.requestsLimitPods = hash.requestsLimitPods - this.requestsLimitPerPod = hash.requestsLimitPerPod - this.milliSecondsInterval = hash.milliSecondsInterval - this.remainingMilliSeconds = hash.remainingMilliSeconds - this.totalRequests = hash.totalRequests - } - - get remainingSeconds () { - return Math.floor(this.remainingMilliSeconds / 1000) - } - - get secondsInterva () { - return Math.floor(this.milliSecondsInterval / 1000) - } - -} diff --git a/client/src/app/+admin/requests/shared/request.service.ts b/client/src/app/+admin/requests/shared/request.service.ts index faa6b9383..53682b111 100644 --- a/client/src/app/+admin/requests/shared/request.service.ts +++ b/client/src/app/+admin/requests/shared/request.service.ts @@ -3,8 +3,9 @@ import { Observable } from 'rxjs/Observable' import 'rxjs/add/operator/catch' import 'rxjs/add/operator/map' -import { RequestStats } from './request-stats.model' +import { RequestScheduler } from '../../../../../../shared' import { AuthHttp, RestExtractor } from '../../../shared' +import { RequestSchedulerStatsAttributes } from './request-stats-attributes.model' @Injectable() export class RequestService { @@ -15,18 +16,18 @@ export class RequestService { private restExtractor: RestExtractor ) {} - getStats (): Observable<{ [ id: string ]: RequestStats }> { + getStats (): Observable { return this.authHttp.get(RequestService.BASE_REQUEST_URL + 'stats') .map(this.restExtractor.extractDataGet) .map(this.buildRequestObjects) .catch((res) => this.restExtractor.handleError(res)) } - private buildRequestObjects (data: any) { + private buildRequestObjects (data: RequestScheduler) { const requestSchedulers = {} Object.keys(data).forEach(requestSchedulerName => { - requestSchedulers[requestSchedulerName] = new RequestStats(data[requestSchedulerName]) + requestSchedulers[requestSchedulerName] = new RequestSchedulerStatsAttributes(data[requestSchedulerName]) }) return requestSchedulers diff --git a/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts index 60eaebb44..7c838fbf0 100644 --- a/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts +++ b/client/src/app/+admin/video-abuses/video-abuse-list/video-abuse-list.component.ts @@ -2,7 +2,8 @@ import { Component } from '@angular/core' import { NotificationsService } from 'angular2-notifications' -import { Utils, VideoAbuseService, VideoAbuse } from '../../../shared' +import { Utils, VideoAbuseService } from '../../../shared' +import { VideoAbuse } from '../../../../../shared' @Component({ selector: 'my-video-abuse-list', diff --git a/client/src/app/core/auth/auth.service.ts b/client/src/app/core/auth/auth.service.ts index 32f7a5503..fcc6b9bb6 100644 --- a/client/src/app/core/auth/auth.service.ts +++ b/client/src/app/core/auth/auth.service.ts @@ -11,6 +11,7 @@ import { NotificationsService } from 'angular2-notifications' import { AuthStatus } from './auth-status.model' import { AuthUser } from './auth-user.model' +import { ClientLocal } from '../../../../../shared' // Do not use the barrel (dependency loop) import { RestExtractor } from '../../shared/rest' @@ -40,9 +41,9 @@ export class AuthService { // FIXME: save in local storage? this.http.get(AuthService.BASE_CLIENT_URL) .map(this.restExtractor.extractDataGet) - .catch((res) => this.restExtractor.handleError(res)) + .catch(res => this.restExtractor.handleError(res)) .subscribe( - result => { + (result: ClientLocal) => { this.clientId = result.client_id this.clientSecret = result.client_secret console.log('Client credentials loaded.') diff --git a/client/src/app/core/config/config.service.ts b/client/src/app/core/config/config.service.ts index a83ec61d2..b8cb15e84 100644 --- a/client/src/app/core/config/config.service.ts +++ b/client/src/app/core/config/config.service.ts @@ -2,16 +2,13 @@ import { Injectable } from '@angular/core' import { Http } from '@angular/http' import { RestExtractor } from '../../shared/rest' +import { ServerConfig } from '../../../../../shared' @Injectable() export class ConfigService { private static BASE_CONFIG_URL = API_URL + '/api/v1/config/' - private config: { - signup: { - enabled: boolean - } - } = { + private config: ServerConfig = { signup: { enabled: false } diff --git a/client/src/app/shared/video-abuse/video-abuse.model.ts b/client/src/app/shared/video-abuse/video-abuse.model.ts deleted file mode 100644 index 49c87d6b8..000000000 --- a/client/src/app/shared/video-abuse/video-abuse.model.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface VideoAbuse { - id: string - reason: string - reporterPodHost: string - reporterUsername: string - videoId: string - createdAt: Date -} diff --git a/client/src/app/shared/video-abuse/video-abuse.service.ts b/client/src/app/shared/video-abuse/video-abuse.service.ts index 4317f9353..32f13b430 100644 --- a/client/src/app/shared/video-abuse/video-abuse.service.ts +++ b/client/src/app/shared/video-abuse/video-abuse.service.ts @@ -7,7 +7,7 @@ import 'rxjs/add/operator/map' import { AuthService } from '../core' import { AuthHttp } from '../auth' import { RestDataSource, RestExtractor, ResultList } from '../rest' -import { VideoAbuse } from './video-abuse.model' +import { VideoAbuse } from '../../../../../shared' @Injectable() export class VideoAbuseService { diff --git a/client/src/app/videos/shared/rate-type.type.ts b/client/src/app/videos/shared/rate-type.type.ts deleted file mode 100644 index 20eea3ae5..000000000 --- a/client/src/app/videos/shared/rate-type.type.ts +++ /dev/null @@ -1 +0,0 @@ -export type RateType = 'like' | 'dislike' diff --git a/client/src/app/videos/shared/video.service.ts b/client/src/app/videos/shared/video.service.ts index a4e3d16df..977b82118 100644 --- a/client/src/app/videos/shared/video.service.ts +++ b/client/src/app/videos/shared/video.service.ts @@ -6,7 +6,6 @@ import 'rxjs/add/operator/map' import { Search } from '../../shared' import { SortField } from './sort-field.type' -import { RateType } from './rate-type.type' import { AuthService } from '../../core' import { AuthHttp, @@ -17,6 +16,7 @@ import { UserService } from '../../shared' import { Video } from './video.model' +import { VideoRateType } from '../../../../../shared' @Injectable() export class VideoService { @@ -145,7 +145,7 @@ export class VideoService { return this.setVideoRate(id, 'dislike') } - getUserVideoRating (id: string) { + getUserVideoRating (id: string): Observable { const url = UserService.BASE_USERS_URL + '/me/videos/' + id + '/rating' return this.authHttp.get(url) @@ -159,7 +159,7 @@ export class VideoService { .catch((res) => this.restExtractor.handleError(res)) } - private setVideoRate (id: string, rateType: RateType) { + private setVideoRate (id: string, rateType: VideoRateType) { const url = VideoService.BASE_VIDEO_URL + id + '/rate' const body = { rating: rateType diff --git a/client/src/app/videos/video-watch/video-watch.component.ts b/client/src/app/videos/video-watch/video-watch.component.ts index 4a547f7e4..808e0eda9 100644 --- a/client/src/app/videos/video-watch/video-watch.component.ts +++ b/client/src/app/videos/video-watch/video-watch.component.ts @@ -11,15 +11,15 @@ import { AuthService, ConfirmService } from '../../core' import { VideoMagnetComponent } from './video-magnet.component' import { VideoShareComponent } from './video-share.component' import { VideoReportComponent } from './video-report.component' -import { RateType, Video, VideoService } from '../shared' +import { Video, VideoService } from '../shared' import { WebTorrentService } from './webtorrent.service' +import { UserVideoRateType, VideoRateType, UserVideoRate } from '../../../../../shared' @Component({ selector: 'my-video-watch', templateUrl: './video-watch.component.html', styleUrls: [ './video-watch.component.scss' ] }) - export class VideoWatchComponent implements OnInit, OnDestroy { private static LOADTIME_TOO_LONG = 20000 @@ -34,7 +34,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { player: videojs.Player playerElement: Element uploadSpeed: number - userRating: RateType = null + userRating: UserVideoRateType = null video: Video = null videoNotFound = false @@ -249,7 +249,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { this.videoService.getUserVideoRating(this.video.id) .subscribe( - ratingObject => { + (ratingObject: UserVideoRate) => { if (ratingObject) { this.userRating = ratingObject.rating } @@ -282,7 +282,7 @@ export class VideoWatchComponent implements OnInit, OnDestroy { ) } - private updateVideoRating (oldRating: RateType, newRating: RateType) { + private updateVideoRating (oldRating: UserVideoRateType, newRating: VideoRateType) { let likesToIncrement = 0 let dislikesToIncrement = 0 diff --git a/server/controllers/api/clients.ts b/server/controllers/api/clients.ts index 8c460096b..96490d04a 100644 --- a/server/controllers/api/clients.ts +++ b/server/controllers/api/clients.ts @@ -3,6 +3,7 @@ import * as express from 'express' import { CONFIG } from '../../initializers' import { logger } from '../../helpers' import { database as db } from '../../initializers/database' +import { ClientLocal } from '../../../shared' const clientsRouter = express.Router() @@ -27,10 +28,11 @@ function getLocalClient (req: express.Request, res: express.Response, next: expr if (err) return next(err) if (!client) return next(new Error('No client available.')) - res.json({ + const json: ClientLocal = { client_id: client.clientId, client_secret: client.clientSecret - }) + } + res.json(json) }) } diff --git a/server/controllers/api/config.ts b/server/controllers/api/config.ts index c63981797..3e9aa77a5 100644 --- a/server/controllers/api/config.ts +++ b/server/controllers/api/config.ts @@ -1,6 +1,7 @@ import * as express from 'express' import { CONFIG } from '../../initializers' +import { ServerConfig } from '../../../shared' const configRouter = express.Router() @@ -8,11 +9,12 @@ configRouter.get('/', getConfig) // Get the client credentials for the PeerTube front end function getConfig (req: express.Request, res: express.Response, next: express.NextFunction) { - res.json({ + const json: ServerConfig = { signup: { enabled: CONFIG.SIGNUP.ENABLED } - }) + } + res.json(json) } // --------------------------------------------------------------------------- diff --git a/server/controllers/api/users.ts b/server/controllers/api/users.ts index ffe5881e5..1e9e65689 100644 --- a/server/controllers/api/users.ts +++ b/server/controllers/api/users.ts @@ -17,6 +17,7 @@ import { setUsersSort, token } from '../../middlewares' +import { UserVideoRate as FormatedUserVideoRate } from '../../../shared' const usersRouter = express.Router() @@ -119,10 +120,11 @@ function getUserVideoRating (req: express.Request, res: express.Response, next: const rating = ratingObj ? ratingObj.type : 'none' - res.json({ + const json: FormatedUserVideoRate = { videoId, rating - }) + } + res.json(json) }) } diff --git a/server/helpers/utils.ts b/server/helpers/utils.ts index 07c1b3f51..5b8d21f70 100644 --- a/server/helpers/utils.ts +++ b/server/helpers/utils.ts @@ -22,8 +22,12 @@ function createEmptyCallback () { } } -function getFormatedObjects (objects: any[], objectsTotal: number) { - const formatedObjects = [] +interface FormatableToJSON { + toFormatedJSON() +} + +function getFormatedObjects (objects: T[], objectsTotal: number) { + const formatedObjects: U[] = [] objects.forEach(function (object) { formatedObjects.push(object.toFormatedJSON()) diff --git a/server/models/user/user-interface.ts b/server/models/user/user-interface.ts index fd98a042e..48c67678b 100644 --- a/server/models/user/user-interface.ts +++ b/server/models/user/user-interface.ts @@ -58,6 +58,10 @@ export interface UserInstance extends UserClass, UserAttributes, Sequelize.Insta id: number createdAt: Date updatedAt: Date + + isPasswordMatch: UserMethods.IsPasswordMatch + toFormatedJSON: UserMethods.ToFormatedJSON + isAdmin: UserMethods.IsAdmin } export interface UserModel extends UserClass, Sequelize.Model {} diff --git a/server/models/user/user-video-rate.ts b/server/models/user/user-video-rate.ts index 1094eb281..4bdd35bc9 100644 --- a/server/models/user/user-video-rate.ts +++ b/server/models/user/user-video-rate.ts @@ -1,6 +1,5 @@ /* User rates per video. - */ import { values } from 'lodash' import * as Sequelize from 'sequelize' diff --git a/server/models/video/video-abuse-interface.ts b/server/models/video/video-abuse-interface.ts index f3e32f79c..c85d09091 100644 --- a/server/models/video/video-abuse-interface.ts +++ b/server/models/video/video-abuse-interface.ts @@ -6,7 +6,7 @@ import { PodInstance } from '../pod' import { VideoAbuse as FormatedVideoAbuse } from '../../../shared/models/video-abuse.model' export namespace VideoAbuseMethods { - export type toFormatedJSON = () => FormatedVideoAbuse + export type ToFormatedJSON = (this: VideoAbuseInstance) => FormatedVideoAbuse export type ListForApiCallback = (err: Error, videoAbuseInstances?: VideoAbuseInstance[], total?: number) => void export type ListForApi = (start: number, count: number, sort: string, callback: ListForApiCallback) => void @@ -28,6 +28,8 @@ export interface VideoAbuseInstance extends VideoAbuseClass, VideoAbuseAttribute updatedAt: Date Pod: PodInstance + + toFormatedJSON: VideoAbuseMethods.ToFormatedJSON } export interface VideoAbuseModel extends VideoAbuseClass, Sequelize.Model {} diff --git a/server/models/video/video-abuse.ts b/server/models/video/video-abuse.ts index f5b4debe6..bc5f01e21 100644 --- a/server/models/video/video-abuse.ts +++ b/server/models/video/video-abuse.ts @@ -13,6 +13,7 @@ import { } from './video-abuse-interface' let VideoAbuse: Sequelize.Model +let toFormatedJSON: VideoAbuseMethods.ToFormatedJSON let listForApi: VideoAbuseMethods.ListForApi export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.DataTypes) { @@ -66,7 +67,7 @@ export default function (sequelize: Sequelize.Sequelize, DataTypes: Sequelize.Da // ------------------------------ METHODS ------------------------------ -function toFormatedJSON (this: VideoAbuseInstance) { +toFormatedJSON = function (this: VideoAbuseInstance) { let reporterPodHost if (this.Pod) { @@ -108,7 +109,7 @@ function associate (models) { }) } -listForApi = function (start, count, sort, callback) { +listForApi = function (start: number, count: number, sort: string, callback: VideoAbuseMethods.ListForApiCallback) { const query = { offset: start, limit: count, diff --git a/server/models/video/video-blacklist-interface.ts b/server/models/video/video-blacklist-interface.ts index c34e7fb09..d4d6528d1 100644 --- a/server/models/video/video-blacklist-interface.ts +++ b/server/models/video/video-blacklist-interface.ts @@ -39,6 +39,8 @@ export interface BlacklistedVideoInstance extends BlacklistedVideoClass, Blackli id: number createdAt: Date updatedAt: Date + + toFormatedJSON: BlacklistedVideoMethods.ToFormatedJSON } export interface BlacklistedVideoModel extends BlacklistedVideoClass, Sequelize.Model {} diff --git a/server/models/video/video-interface.ts b/server/models/video/video-interface.ts index 5fefc2bb1..4b591b9e7 100644 --- a/server/models/video/video-interface.ts +++ b/server/models/video/video-interface.ts @@ -146,6 +146,17 @@ export interface VideoInstance extends VideoClass, VideoAttributes, Sequelize.In id: string createdAt: Date updatedAt: Date + + generateMagnetUri: VideoMethods.GenerateMagnetUri + getVideoFilename: VideoMethods.GetVideoFilename + getThumbnailName: VideoMethods.GetThumbnailName + getPreviewName: VideoMethods.GetPreviewName + getTorrentName: VideoMethods.GetTorrentName + isOwned: VideoMethods.IsOwned + toFormatedJSON: VideoMethods.ToFormatedJSON + toAddRemoteJSON: VideoMethods.ToAddRemoteJSON + toUpdateRemoteJSON: VideoMethods.ToUpdateRemoteJSON + transcodeVideofile: VideoMethods.TranscodeVideofile } export interface VideoModel extends VideoClass, Sequelize.Model {} diff --git a/shared/models/client-local.model.ts b/shared/models/client-local.model.ts new file mode 100644 index 000000000..c27963e88 --- /dev/null +++ b/shared/models/client-local.model.ts @@ -0,0 +1,4 @@ +export interface ClientLocal { + client_id: string + client_secret: string +} diff --git a/shared/models/index.ts b/shared/models/index.ts index 1ddc8545f..fffac795e 100644 --- a/shared/models/index.ts +++ b/shared/models/index.ts @@ -1,3 +1,4 @@ +export * from './client-local.model' export * from './job.model' export * from './pod.model' export * from './request-scheduler.model' @@ -6,3 +7,4 @@ export * from './user.model' export * from './video-abuse.model' export * from './video-blacklist.model' export * from './video.model' +export * from './server-config.model' diff --git a/shared/models/server-config.model.ts b/shared/models/server-config.model.ts new file mode 100644 index 000000000..a39156963 --- /dev/null +++ b/shared/models/server-config.model.ts @@ -0,0 +1,5 @@ +export interface ServerConfig { + signup: { + enabled: boolean + } +} diff --git a/shared/models/user-video-rate.model.ts b/shared/models/user-video-rate.model.ts index d48774a4b..b770f4073 100644 --- a/shared/models/user-video-rate.model.ts +++ b/shared/models/user-video-rate.model.ts @@ -1 +1,7 @@ export type VideoRateType = 'like' | 'dislike' +export type UserVideoRateType = 'like' | 'dislike' | 'none' + +export interface UserVideoRate { + videoId: string + rating: UserVideoRateType +} diff --git a/shared/models/video-abuse.model.ts b/shared/models/video-abuse.model.ts index e005a1fd5..72e32cbc7 100644 --- a/shared/models/video-abuse.model.ts +++ b/shared/models/video-abuse.model.ts @@ -3,6 +3,6 @@ export interface VideoAbuse { reporterPodHost: string reason: string reporterUsername: string - videoId: number + videoId: string createdAt: Date }