+
diff --git a/client/src/app/menu/menu.component.scss b/client/src/app/menu/menu.component.scss
index 4714a9e87..1f3c889cf 100644
--- a/client/src/app/menu/menu.component.scss
+++ b/client/src/app/menu/menu.component.scss
@@ -132,6 +132,13 @@ menu {
background-image: url('../../assets/images/menu/administration.svg');
}
+
+ &.icon-about {
+ width: 23px;
+ height: 23px;
+
+ background-image: url('../../assets/images/menu/about.svg');
+ }
}
}
}
diff --git a/client/src/app/shared/forms/form-validators/custom-config.ts b/client/src/app/shared/forms/form-validators/custom-config.ts
index 9e3fa98d8..a0966a9a7 100644
--- a/client/src/app/shared/forms/form-validators/custom-config.ts
+++ b/client/src/app/shared/forms/form-validators/custom-config.ts
@@ -3,7 +3,7 @@ import { Validators } from '@angular/forms'
export const INSTANCE_NAME = {
VALIDATORS: [ Validators.required ],
MESSAGES: {
- 'required': 'Instance name is required.',
+ 'required': 'Instance name is required.'
}
}
diff --git a/client/src/app/videos/shared/markdown.service.ts b/client/src/app/videos/shared/markdown.service.ts
index fd0330f9b..3f51a82ce 100644
--- a/client/src/app/videos/shared/markdown.service.ts
+++ b/client/src/app/videos/shared/markdown.service.ts
@@ -7,12 +7,13 @@ export class MarkdownService {
private markdownIt: MarkdownIt.MarkdownIt
constructor () {
- this.markdownIt = new MarkdownIt('zero', { linkify: true })
+ this.markdownIt = new MarkdownIt('zero', { linkify: true, breaks: true })
.enable('linkify')
.enable('autolink')
.enable('emphasis')
.enable('link')
.enable('newline')
+ .enable('list')
this.setTargetToLinks()
}
diff --git a/client/src/assets/images/menu/about.svg b/client/src/assets/images/menu/about.svg
new file mode 100644
index 000000000..eac2932a9
--- /dev/null
+++ b/client/src/assets/images/menu/about.svg
@@ -0,0 +1,12 @@
+
+
diff --git a/server/controllers/api/config.ts b/server/controllers/api/config.ts
index e4cb02820..89163edb3 100644
--- a/server/controllers/api/config.ts
+++ b/server/controllers/api/config.ts
@@ -1,19 +1,22 @@
import * as express from 'express'
+import { omit } from 'lodash'
import { ServerConfig, UserRight } from '../../../shared'
+import { About } from '../../../shared/models/config/about.model'
import { CustomConfig } from '../../../shared/models/config/custom-config.model'
import { unlinkPromise, writeFilePromise } from '../../helpers/core-utils'
import { isSignupAllowed } from '../../helpers/utils'
import { CONFIG, CONSTRAINTS_FIELDS, reloadConfig } from '../../initializers'
import { asyncMiddleware, authenticate, ensureUserHasRight } from '../../middlewares'
import { customConfigUpdateValidator } from '../../middlewares/validators/config'
-import { omit } from 'lodash'
const packageJSON = require('../../../../package.json')
const configRouter = express.Router()
+configRouter.get('/about', getAbout)
configRouter.get('/',
asyncMiddleware(getConfig)
)
+
configRouter.get('/custom',
authenticate,
ensureUserHasRight(UserRight.MANAGE_CONFIGURATION),
@@ -39,6 +42,9 @@ async function getConfig (req: express.Request, res: express.Response, next: exp
.map(r => parseInt(r, 10))
const json: ServerConfig = {
+ instance: {
+ name: CONFIG.INSTANCE.NAME
+ },
serverVersion: packageJSON.version,
signup: {
allowed
@@ -64,6 +70,18 @@ async function getConfig (req: express.Request, res: express.Response, next: exp
return res.json(json)
}
+function getAbout (req: express.Request, res: express.Response, next: express.NextFunction) {
+ const about: About = {
+ instance: {
+ name: CONFIG.INSTANCE.NAME,
+ description: CONFIG.INSTANCE.DESCRIPTION,
+ terms: CONFIG.INSTANCE.TERMS
+ }
+ }
+
+ return res.json(about).end()
+}
+
async function getCustomConfig (req: express.Request, res: express.Response, next: express.NextFunction) {
const data = customConfig()
diff --git a/server/tests/api/server/config.ts b/server/tests/api/server/config.ts
index f83e21e82..35a5c430b 100644
--- a/server/tests/api/server/config.ts
+++ b/server/tests/api/server/config.ts
@@ -2,7 +2,8 @@
import 'mocha'
import * as chai from 'chai'
-import { deleteCustomConfig, killallServers, reRunServer } from '../../utils'
+import { About } from '../../../../shared/models/config/about.model'
+import { deleteCustomConfig, getAbout, killallServers, reRunServer } from '../../utils'
const expect = chai.expect
import {
@@ -108,6 +109,7 @@ describe('Test config', function () {
expect(data.instance.name).to.equal('PeerTube updated')
expect(data.instance.description).to.equal('my super description')
expect(data.instance.terms).to.equal('my super terms')
+ expect(data.cache.previews.size).to.equal(2)
expect(data.signup.enabled).to.be.false
expect(data.signup.limit).to.equal(5)
expect(data.admin.email).to.equal('superadmin1@example.com')
@@ -131,6 +133,9 @@ describe('Test config', function () {
const res = await getCustomConfig(server.url, server.accessToken)
const data = res.body
+ expect(data.instance.name).to.equal('PeerTube updated')
+ expect(data.instance.description).to.equal('my super description')
+ expect(data.instance.terms).to.equal('my super terms')
expect(data.cache.previews.size).to.equal(2)
expect(data.signup.enabled).to.be.false
expect(data.signup.limit).to.equal(5)
@@ -145,6 +150,15 @@ describe('Test config', function () {
expect(data.transcoding.resolutions['1080p']).to.be.false
})
+ it('Should fetch the about information', async function () {
+ const res = await getAbout(server.url)
+ const data: About = res.body
+
+ expect(data.instance.name).to.equal('PeerTube updated')
+ expect(data.instance.description).to.equal('my super description')
+ expect(data.instance.terms).to.equal('my super terms')
+ })
+
it('Should remove the custom configuration', async function () {
this.timeout(10000)
diff --git a/server/tests/utils/server/config.ts b/server/tests/utils/server/config.ts
index b6905757a..e5411117a 100644
--- a/server/tests/utils/server/config.ts
+++ b/server/tests/utils/server/config.ts
@@ -1,15 +1,24 @@
-import * as request from 'supertest'
import { makeDeleteRequest, makeGetRequest, makePutBodyRequest } from '../'
import { CustomConfig } from '../../../../shared/models/config/custom-config.model'
function getConfig (url: string) {
const path = '/api/v1/config'
- return request(url)
- .get(path)
- .set('Accept', 'application/json')
- .expect(200)
- .expect('Content-Type', /json/)
+ return makeGetRequest({
+ url,
+ path,
+ statusCodeExpected: 200
+ })
+}
+
+function getAbout (url: string) {
+ const path = '/api/v1/config/about'
+
+ return makeGetRequest({
+ url,
+ path,
+ statusCodeExpected: 200
+ })
}
function getCustomConfig (url: string, token: string, statusCodeExpected = 200) {
@@ -52,5 +61,6 @@ export {
getConfig,
getCustomConfig,
updateCustomConfig,
+ getAbout,
deleteCustomConfig
}
diff --git a/shared/models/config/about.model.ts b/shared/models/config/about.model.ts
new file mode 100644
index 000000000..7d11da850
--- /dev/null
+++ b/shared/models/config/about.model.ts
@@ -0,0 +1,7 @@
+export interface About {
+ instance: {
+ name: string
+ description: string
+ terms: string
+ }
+}
diff --git a/shared/models/config/server-config.model.ts b/shared/models/config/server-config.model.ts
index 5cb176c5b..fdc36bcc1 100644
--- a/shared/models/config/server-config.model.ts
+++ b/shared/models/config/server-config.model.ts
@@ -1,11 +1,18 @@
export interface ServerConfig {
- serverVersion: string,
+ serverVersion: string
+
+ instance: {
+ name: string
+ }
+
signup: {
allowed: boolean
}
+
transcoding: {
enabledResolutions: number[]
}
+
avatar: {
file: {
size: {
@@ -14,6 +21,7 @@ export interface ServerConfig {
extensions: string[]
}
}
+
video: {
file: {
extensions: string[]