summaryrefslogtreecommitdiff
path: root/src/server/web
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2019-04-14 20:38:55 +0900
committersyuilo <syuilotan@yahoo.co.jp>2019-04-14 20:38:55 +0900
commitd66e4b7ff97d512e2a2523815e2eef170456b37f (patch)
tree59ae1a102d88b5c2c2236b734ea4a584b4f9ba46 /src/server/web
parent10.100.0 (diff)
parent11.0.0 (diff)
downloadmisskey-d66e4b7ff97d512e2a2523815e2eef170456b37f.tar.gz
misskey-d66e4b7ff97d512e2a2523815e2eef170456b37f.tar.bz2
misskey-d66e4b7ff97d512e2a2523815e2eef170456b37f.zip
Merge branch 'develop'
Diffstat (limited to 'src/server/web')
-rw-r--r--src/server/web/docs.ts6
-rw-r--r--src/server/web/feed.ts44
-rw-r--r--src/server/web/index.ts78
-rw-r--r--src/server/web/manifest.ts3
-rw-r--r--src/server/web/url-preview.ts2
-rw-r--r--src/server/web/views/info.pug10
-rw-r--r--src/server/web/views/user.pug14
7 files changed, 75 insertions, 82 deletions
diff --git a/src/server/web/docs.ts b/src/server/web/docs.ts
index d9ba14a8ed..374dbf3bd2 100644
--- a/src/server/web/docs.ts
+++ b/src/server/web/docs.ts
@@ -34,14 +34,14 @@ async function genVars(lang: string): Promise<{ [key: string]: any }> {
const docs = glob.sync(`src/docs/**/*.${lang}.md`, { cwd });
vars['docs'] = {};
for (const x of docs) {
- const [, name] = x.match(/docs\/(.+?)\.(.+?)\.md$/);
+ const [, name] = x.match(/docs\/(.+?)\.(.+?)\.md$/)!;
if (vars['docs'][name] == null) {
vars['docs'][name] = {
name,
title: {}
};
}
- vars['docs'][name]['title'][lang] = fs.readFileSync(cwd + x, 'utf-8').match(/^# (.+?)\r?\n/)[1];
+ vars['docs'][name]['title'][lang] = fs.readFileSync(cwd + x, 'utf-8').match(/^# (.+?)\r?\n/)![1];
}
vars['kebab'] = (string: string) => string.replace(/([a-z])([A-Z])/g, '$1-$2').replace(/\s+/g, '-').toLowerCase();
@@ -97,7 +97,7 @@ router.get('/*/*', async ctx => {
await ctx.render('../../../../src/docs/article', Object.assign({
id: doc,
html: conv.makeHtml(md),
- title: md.match(/^# (.+?)\r?\n/)[1],
+ title: md.match(/^# (.+?)\r?\n/)![1],
src: `https://github.com/syuilo/misskey/tree/master/src/docs/${doc}.${lang}.md`
}, await genVars(lang)));
diff --git a/src/server/web/feed.ts b/src/server/web/feed.ts
index 09ac10c576..6b660fe188 100644
--- a/src/server/web/feed.ts
+++ b/src/server/web/feed.ts
@@ -1,25 +1,26 @@
import { Feed } from 'feed';
import config from '../../config';
-import Note from '../../models/note';
-import { IUser } from '../../models/user';
-import { getOriginalUrl } from '../../misc/get-drive-file-url';
+import { User } from '../../models/entities/user';
+import { Notes, DriveFiles, UserProfiles } from '../../models';
+import { In } from 'typeorm';
+import { ensure } from '../../prelude/ensure';
-export default async function(user: IUser) {
+export default async function(user: User) {
const author: Author = {
link: `${config.url}/@${user.username}`,
name: user.name || user.username
};
- const notes = await Note.find({
- userId: user._id,
- renoteId: null,
- $or: [
- { visibility: 'public' },
- { visibility: 'home' }
- ]
- }, {
- sort: { createdAt: -1 },
- limit: 20
+ const profile = await UserProfiles.findOne({ userId: user.id }).then(ensure);
+
+ const notes = await Notes.find({
+ where: {
+ userId: user.id,
+ renoteId: null,
+ visibility: In(['public', 'home'])
+ },
+ order: { createdAt: -1 },
+ take: 20
});
const feed = new Feed({
@@ -27,7 +28,7 @@ export default async function(user: IUser) {
title: `${author.name} (@${user.username}@${config.host})`,
updated: notes[0].createdAt,
generator: 'Misskey',
- description: `${user.notesCount} Notes, ${user.followingCount} Following, ${user.followersCount} Followers${user.description ? ` · ${user.description}` : ''}`,
+ description: `${user.notesCount} Notes, ${user.followingCount} Following, ${user.followersCount} Followers${profile.description ? ` · ${profile.description}` : ''}`,
link: author.link,
image: user.avatarUrl,
feedLinks: {
@@ -38,15 +39,18 @@ export default async function(user: IUser) {
} as FeedOptions);
for (const note of notes) {
- const file = note._files && note._files.find(file => file.contentType.startsWith('image/'));
+ const files = note.fileIds.length > 0 ? await DriveFiles.find({
+ id: In(note.fileIds)
+ }) : [];
+ const file = files.find(file => file.type.startsWith('image/'));
feed.addItem({
title: `New note by ${author.name}`,
- link: `${config.url}/notes/${note._id}`,
+ link: `${config.url}/notes/${note.id}`,
date: note.createdAt,
- description: note.cw,
- content: note.text,
- image: file && getOriginalUrl(file)
+ description: note.cw || undefined,
+ content: note.text || undefined,
+ image: file ? DriveFiles.getPublicUrl(file) || undefined : undefined
});
}
diff --git a/src/server/web/index.ts b/src/server/web/index.ts
index d8525ba114..5cadf1b124 100644
--- a/src/server/web/index.ts
+++ b/src/server/web/index.ts
@@ -9,19 +9,17 @@ import * as Router from 'koa-router';
import * as send from 'koa-send';
import * as favicon from 'koa-favicon';
import * as views from 'koa-views';
-import { ObjectID } from 'mongodb';
import docs from './docs';
import packFeed from './feed';
-import User from '../../models/user';
-import parseAcct from '../../misc/acct/parse';
-import config from '../../config';
-import Note, { pack as packNote } from '../../models/note';
-import getNoteSummary from '../../misc/get-note-summary';
import fetchMeta from '../../misc/fetch-meta';
-import Emoji from '../../models/emoji';
import * as pkg from '../../../package.json';
import { genOpenapiSpec } from '../api/openapi/gen-spec';
+import config from '../../config';
+import { Users, Notes, Emojis, UserProfiles } from '../../models';
+import parseAcct from '../../misc/acct/parse';
+import getNoteSummary from '../../misc/get-note-summary';
+import { ensure } from '../../prelude/ensure';
const client = `${__dirname}/../../client/`;
@@ -100,7 +98,7 @@ router.get('/api.json', async ctx => {
const getFeed = async (acct: string) => {
const { username, host } = parseAcct(acct);
- const user = await User.findOne({
+ const user = await Users.findOne({
usernameLower: username.toLowerCase(),
host
});
@@ -148,16 +146,17 @@ router.get('/@:user.json', async ctx => {
// User
router.get('/@:user', async (ctx, next) => {
const { username, host } = parseAcct(ctx.params.user);
- const user = await User.findOne({
+ const user = await Users.findOne({
usernameLower: username.toLowerCase(),
host
});
if (user != null) {
+ const profile = await UserProfiles.findOne(user.id).then(ensure);
const meta = await fetchMeta();
await ctx.render('user', {
- user,
- instanceName: meta.name
+ user, profile,
+ instanceName: meta.name || 'Misskey'
});
ctx.set('Cache-Control', 'public, max-age=180');
} else {
@@ -167,19 +166,12 @@ router.get('/@:user', async (ctx, next) => {
});
router.get('/users/:user', async ctx => {
- if (!ObjectID.isValid(ctx.params.user)) {
- ctx.status = 404;
- return;
- }
-
- const userId = new ObjectID(ctx.params.user);
-
- const user = await User.findOne({
- _id: userId,
+ const user = await Users.findOne({
+ id: ctx.params.user,
host: null
});
- if (user === null) {
+ if (user == null) {
ctx.status = 404;
return;
}
@@ -189,26 +181,24 @@ router.get('/users/:user', async ctx => {
// Note
router.get('/notes/:note', async ctx => {
- if (ObjectID.isValid(ctx.params.note)) {
- const note = await Note.findOne({ _id: ctx.params.note });
+ const note = await Notes.findOne(ctx.params.note);
- if (note) {
- const _note = await packNote(note);
- const meta = await fetchMeta();
- await ctx.render('note', {
- note: _note,
- summary: getNoteSummary(_note),
- instanceName: meta.name
- });
-
- if (['public', 'home'].includes(note.visibility)) {
- ctx.set('Cache-Control', 'public, max-age=180');
- } else {
- ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
- }
+ if (note) {
+ const _note = await Notes.pack(note);
+ const meta = await fetchMeta();
+ await ctx.render('note', {
+ note: _note,
+ summary: getNoteSummary(_note),
+ instanceName: meta.name || 'Misskey'
+ });
- return;
+ if (['public', 'home'].includes(note.visibility)) {
+ ctx.set('Cache-Control', 'public, max-age=180');
+ } else {
+ ctx.set('Cache-Control', 'private, max-age=0, must-revalidate');
}
+
+ return;
}
ctx.status = 404;
@@ -217,10 +207,8 @@ router.get('/notes/:note', async ctx => {
router.get('/info', async ctx => {
const meta = await fetchMeta();
- const emojis = await Emoji.find({ host: null }, {
- fields: {
- _id: false
- }
+ const emojis = await Emojis.find({
+ where: { host: null }
});
await ctx.render('info', {
version: pkg.version,
@@ -232,7 +220,9 @@ router.get('/info', async ctx => {
cores: os.cpus().length
},
emojis: emojis,
- meta: meta
+ meta: meta,
+ originalUsersCount: await Users.count({ host: null }),
+ originalNotesCount: await Notes.count({ userHost: null })
});
});
@@ -247,7 +237,7 @@ router.get('*', async ctx => {
const meta = await fetchMeta();
await ctx.render('base', {
img: meta.bannerUrl,
- title: meta.name,
+ title: meta.name || 'Misskey',
desc: meta.description,
icon: meta.iconUrl
});
diff --git a/src/server/web/manifest.ts b/src/server/web/manifest.ts
index 35d3d1b666..4acfb22de5 100644
--- a/src/server/web/manifest.ts
+++ b/src/server/web/manifest.ts
@@ -1,10 +1,9 @@
import * as Koa from 'koa';
import * as manifest from '../../client/assets/manifest.json';
-import * as deepcopy from 'deepcopy';
import fetchMeta from '../../misc/fetch-meta';
module.exports = async (ctx: Koa.BaseContext) => {
- const json = deepcopy(manifest);
+ const json = JSON.parse(JSON.stringify(manifest));
const instance = await fetchMeta();
diff --git a/src/server/web/url-preview.ts b/src/server/web/url-preview.ts
index aed475e6ff..7d0080b4d2 100644
--- a/src/server/web/url-preview.ts
+++ b/src/server/web/url-preview.ts
@@ -43,7 +43,7 @@ module.exports = async (ctx: Koa.BaseContext) => {
}
};
-function wrap(url: string): string {
+function wrap(url?: string): string | null {
return url != null
? url.match(/^https?:\/\//)
? `${config.url}/proxy/preview.jpg?${query({
diff --git a/src/server/web/views/info.pug b/src/server/web/views/info.pug
index 1c4b272a62..c8b0bd939a 100644
--- a/src/server/web/views/info.pug
+++ b/src/server/web/views/info.pug
@@ -70,15 +70,15 @@ html
table
tr
th Instance
- td= meta.name
+ td= meta.name || 'Misskey'
tr
th Description
td= meta.description
tr
th Maintainer
td
- = meta.maintainer.name
- | &lt;#{meta.maintainer.email}&gt;
+ = meta.maintainerName
+ | &lt;#{meta.maintainerEmail}&gt;
tr
th System
td= os
@@ -93,10 +93,10 @@ html
td= cpu.model
tr
th Original users
- td= meta.stats.originalUsersCount
+ td= originalUsersCount
tr
th Original notes
- td= meta.stats.originalNotesCount
+ td= originalNotesCount
tr
th Registration
td= !meta.disableRegistration ? 'yes' : 'no'
diff --git a/src/server/web/views/user.pug b/src/server/web/views/user.pug
index 3f32933f52..bff98ba80f 100644
--- a/src/server/web/views/user.pug
+++ b/src/server/web/views/user.pug
@@ -9,12 +9,12 @@ block title
= `${title} | ${instanceName}`
block desc
- meta(name='description' content= user.description)
+ meta(name='description' content= profile.description)
block og
meta(property='og:type' content='blog')
meta(property='og:title' content= title)
- meta(property='og:description' content= user.description)
+ meta(property='og:description' content= profile.description)
meta(property='og:url' content= url)
meta(property='og:image' content= img)
@@ -24,12 +24,12 @@ block meta
meta(name='twitter:card' content='summary')
- if user.twitter
- meta(name='twitter:creator' content=`@${user.twitter.screenName}`)
+ if profile.twitter
+ meta(name='twitter:creator' content=`@${profile.twitter.screenName}`)
if !user.host
- link(rel='alternate' href=`${config.url}/users/${user._id}` type='application/activity+json')
+ link(rel='alternate' href=`${config.url}/users/${user.id}` type='application/activity+json')
if user.uri
link(rel='alternate' href=user.uri type='application/activity+json')
- if user.url
- link(rel='alternate' href=user.url type='text/html')
+ if profile.url
+ link(rel='alternate' href=profile.url type='text/html')