summaryrefslogtreecommitdiff
path: root/src/server/web
diff options
context:
space:
mode:
authorrinsuki <428rinsuki+git@gmail.com>2018-05-17 07:52:24 +0900
committerrinsuki <428rinsuki+git@gmail.com>2018-05-17 07:52:24 +0900
commit829b4012e6dc14eb64a3d8f60826fe9b6a41b40d (patch)
tree42ac37f323db349dca9316e6fdb39fc33b860686 /src/server/web
parentadd yarn.lock to gitignore (diff)
parentUpdate deliver.ts (diff)
downloadmisskey-829b4012e6dc14eb64a3d8f60826fe9b6a41b40d.tar.gz
misskey-829b4012e6dc14eb64a3d8f60826fe9b6a41b40d.tar.bz2
misskey-829b4012e6dc14eb64a3d8f60826fe9b6a41b40d.zip
Merge branch 'master' into fix/yarn-lock-ignore
Diffstat (limited to 'src/server/web')
-rw-r--r--src/server/web/index.ts67
-rw-r--r--src/server/web/url-preview.ts4
-rw-r--r--src/server/web/views/note.pug25
-rw-r--r--src/server/web/views/user.pug20
4 files changed, 109 insertions, 7 deletions
diff --git a/src/server/web/index.ts b/src/server/web/index.ts
index eba0c372b0..6ceef17c1c 100644
--- a/src/server/web/index.ts
+++ b/src/server/web/index.ts
@@ -7,14 +7,32 @@ import * as Koa from 'koa';
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 docs from './docs';
+import User from '../../models/user';
+import parseAcct from '../../acct/parse';
+import { fa } from '../../build/fa';
+import config from '../../config';
+import Note, { pack as packNote } from '../../models/note';
+import getNoteSummary from '../../renderers/get-note-summary';
+const consts = require('../../const.json');
const client = `${__dirname}/../../client/`;
// Init app
const app = new Koa();
+// Init renderer
+app.use(views(__dirname + '/views', {
+ extension: 'pug',
+ options: {
+ config,
+ themeColor: consts.themeColor,
+ facss: fa.dom.css()
+ }
+}));
+
// Serve favicon
app.use(favicon(`${client}/assets/favicon.ico`));
@@ -42,17 +60,21 @@ router.get('/assets/*', async ctx => {
// Apple touch icon
router.get('/apple-touch-icon.png', async ctx => {
- await send(ctx, `${client}/assets/apple-touch-icon.png`);
+ await send(ctx, '/assets/apple-touch-icon.png', {
+ root: client
+ });
});
// ServiceWroker
-router.get(/^\/sw\.(.+?)\.js$/, async ctx => {
- await send(ctx, `${client}/assets/sw.${ctx.params[0]}.js`);
-});
+//router.get(/^\/sw\.(.+?)\.js$/, async ctx => {
+// await send(ctx, `${client}/assets/sw.${ctx.params[0]}.js`);
+//});
// Manifest
router.get('/manifest.json', async ctx => {
- await send(ctx, `${client}/assets/manifest.json`);
+ await send(ctx, '/assets/manifest.json', {
+ root: client
+ });
});
//#endregion
@@ -61,7 +83,40 @@ router.get('/manifest.json', async ctx => {
router.use('/docs', docs.routes());
// URL preview endpoint
-router.get('url', require('./url-preview'));
+router.get('/url', require('./url-preview'));
+
+//#region for crawlers
+// User
+router.get('/@:user', async (ctx, next) => {
+ const { username, host } = parseAcct(ctx.params.user);
+ const user = await User.findOne({
+ usernameLower: username.toLowerCase(),
+ host
+ });
+
+ if (user != null) {
+ await ctx.render('user', { user });
+ } else {
+ // リモートユーザーなので
+ await next();
+ }
+});
+
+// Note
+router.get('/notes/:note', async ctx => {
+ const note = await Note.findOne({ _id: ctx.params.note });
+
+ if (note != null) {
+ const _note = await packNote(note);
+ await ctx.render('note', {
+ note: _note,
+ summary: getNoteSummary(_note)
+ });
+ } else {
+ ctx.status = 404;
+ }
+});
+//#endregion
// Render base html for all requests
router.get('*', async ctx => {
diff --git a/src/server/web/url-preview.ts b/src/server/web/url-preview.ts
index d5464d0cd4..cd53837a25 100644
--- a/src/server/web/url-preview.ts
+++ b/src/server/web/url-preview.ts
@@ -14,6 +14,8 @@ module.exports = async (ctx: Koa.Context) => {
function wrap(url: string): string {
return url != null
- ? `https://images.weserv.nl/?url=${url.replace(/^https?:\/\//, '')}`
+ ? url.startsWith('https://') || url.startsWith('data:')
+ ? url
+ : `https://images.weserv.nl/?url=${encodeURIComponent(url.replace(/^http:\/\//, ''))}`
: null;
}
diff --git a/src/server/web/views/note.pug b/src/server/web/views/note.pug
new file mode 100644
index 0000000000..22f1834059
--- /dev/null
+++ b/src/server/web/views/note.pug
@@ -0,0 +1,25 @@
+extends ../../../../src/client/app/base
+
+block vars
+ - const user = note.user;
+ - const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`;
+ - const url = `${config.url}/notes/${note.id}`;
+
+block title
+ = `${title} | Misskey`
+
+block desc
+ meta(name='description' content= summary)
+
+block meta
+ meta(name='twitter:card' content='summary')
+ meta(property='og:type' content='article')
+ meta(property='og:title' content= title)
+ meta(property='og:description' content= summary)
+ meta(property='og:url' content= url)
+ meta(property='og:image' content= user.avatarUrl)
+
+ if note.prev
+ link(rel='prev' href=`${config.url}/notes/${note.prev}`)
+ if note.next
+ link(rel='next' href=`${config.url}/notes/${note.next}`)
diff --git a/src/server/web/views/user.pug b/src/server/web/views/user.pug
new file mode 100644
index 0000000000..b5ea2f6eb4
--- /dev/null
+++ b/src/server/web/views/user.pug
@@ -0,0 +1,20 @@
+extends ../../../../src/client/app/base
+
+block vars
+ - const title = user.name ? `${user.name} (@${user.username})` : `@${user.username}`;
+ - const url = config.url + '/@' + (user.host ? `${user.username}@${user.host}` : user.username);
+ - const img = user.avatarId ? `${config.drive_url}/${user.avatarId}` : null;
+
+block title
+ = `${title} | Misskey`
+
+block desc
+ meta(name='description' content= user.description)
+
+block meta
+ meta(name='twitter:card' content='summary')
+ meta(property='og:type' content='blog')
+ meta(property='og:title' content= title)
+ meta(property='og:description' content= user.description)
+ meta(property='og:url' content= url)
+ meta(property='og:image' content= img)