This commit is contained in:
syuilo 2017-11-01 01:38:19 +09:00
parent 346c2959e0
commit 71c3e11708
7 changed files with 65 additions and 7 deletions

View File

@ -21,7 +21,8 @@ module.exports = async (params, user) => new Promise(async (res, rej) => {
const channel = await Channel.insert({ const channel = await Channel.insert({
created_at: new Date(), created_at: new Date(),
user_id: user._id, user_id: user._id,
title: title title: title,
index: 0
}); });
// Response // Response

View File

@ -153,6 +153,16 @@ module.exports = (params, user: IUser, app) => new Promise(async (res, rej) => {
if (repost && !isQuote) { if (repost && !isQuote) {
return rej('チャンネル内部では引用ではないRepostをすることはできません'); return rej('チャンネル内部では引用ではないRepostをすることはできません');
} }
} else {
// 返信対象の投稿がチャンネルへの投稿だったらダメ
if (inReplyToPost && inReplyToPost.channel_id != null) {
return rej('チャンネル外部からチャンネル内部の投稿に返信することはできません');
}
// Repost対象の投稿がチャンネルへの投稿だったらダメ
if (repost && repost.channel_id != null) {
return rej('チャンネル外部からチャンネル内部の投稿をRepostすることはできません');
}
} }
// Get 'poll' parameter // Get 'poll' parameter
@ -199,6 +209,7 @@ module.exports = (params, user: IUser, app) => new Promise(async (res, rej) => {
const post = await Post.insert({ const post = await Post.insert({
created_at: new Date(), created_at: new Date(),
channel_id: channel ? channel._id : undefined, channel_id: channel ? channel._id : undefined,
index: channel ? channel.index + 1 : undefined,
media_ids: files ? files.map(file => file._id) : undefined, media_ids: files ? files.map(file => file._id) : undefined,
reply_to_id: inReplyToPost ? inReplyToPost._id : undefined, reply_to_id: inReplyToPost ? inReplyToPost._id : undefined,
repost_id: repost ? repost._id : undefined, repost_id: repost ? repost._id : undefined,
@ -217,6 +228,12 @@ module.exports = (params, user: IUser, app) => new Promise(async (res, rej) => {
// ----------------------------------------------------------- // -----------------------------------------------------------
// Post processes // Post processes
Channel.update({ _id: channel._id }, {
$inc: {
index: 1
}
});
User.update({ _id: user._id }, { User.update({ _id: user._id }, {
$set: { $set: {
latest_post: post latest_post: post

View File

@ -10,4 +10,5 @@ export type IChannel = {
created_at: Date; created_at: Date;
title: string; title: string;
user_id: mongo.ObjectID; user_id: mongo.ObjectID;
index: number;
}; };

View File

@ -8,6 +8,7 @@ import Reaction from '../models/post-reaction';
import { IUser } from '../models/user'; import { IUser } from '../models/user';
import Vote from '../models/poll-vote'; import Vote from '../models/poll-vote';
import serializeApp from './app'; import serializeApp from './app';
import serializeChannel from './channel';
import serializeUser from './user'; import serializeUser from './user';
import serializeDriveFile from './drive-file'; import serializeDriveFile from './drive-file';
import parse from '../common/text'; import parse from '../common/text';
@ -76,8 +77,13 @@ const self = (
_post.app = await serializeApp(_post.app_id); _post.app = await serializeApp(_post.app_id);
} }
// Populate channel
if (_post.channel_id) {
_post.channel = await serializeChannel(_post.channel_id);
}
// Populate media
if (_post.media_ids) { if (_post.media_ids) {
// Populate media
_post.media = await Promise.all(_post.media_ids.map(async fileId => _post.media = await Promise.all(_post.media_ids.map(async fileId =>
await serializeDriveFile(fileId) await serializeDriveFile(fileId)
)); ));

View File

@ -2,8 +2,9 @@
<mk-ui ref="ui"> <mk-ui ref="ui">
<main if={ !parent.fetching }> <main if={ !parent.fetching }>
<h1>{ parent.channel.title }</h1> <h1>{ parent.channel.title }</h1>
<mk-channel-post each={ parent.posts } post={ this }/> <mk-channel-post if={ parent.posts } each={ parent.posts.reverse() } post={ this } form={ parent.refs.form }/>
<mk-channel-form channel={ parent.channel }/> <hr>
<mk-channel-form channel={ parent.channel } ref="form"/>
</main> </main>
</mk-ui> </mk-ui>
<style> <style>
@ -11,6 +12,8 @@
display block display block
main main
padding 8px
> h1 > h1
color #f00 color #f00
</style> </style>
@ -57,9 +60,13 @@
<mk-channel-post> <mk-channel-post>
<header> <header>
<b>{ post.user.name }</b> <a class="index" onclick={ reply }>{ post.index }:</a>
<a class="name" href={ '/' + post.user.username }><b>{ post.user.name }</b></a>
<mk-time time={ post.created_at } mode="detail"/>
<span>ID:<i>{ post.user.username }</i></span>
</header> </header>
<div> <div>
<a if={ post.reply_to }>&gt;&gt;{ post.reply_to.index }</a>
{ post.text } { post.text }
</div> </div>
<style> <style>
@ -69,17 +76,35 @@
padding 0 padding 0
> header > header
> b > .index
margin-right 0.25em
color #000
> .name
margin-right 0.5em
color #008000 color #008000
> mk-time
margin-right 0.5em
> div
padding 0 0 1em 2em
</style> </style>
<script> <script>
this.post = this.opts.post; this.post = this.opts.post;
this.form = this.opts.form;
this.reply = () => {
this.form.update({
reply: this.post
});
};
</script> </script>
</mk-channel-post> </mk-channel-post>
<mk-channel-form> <mk-channel-form>
<p if={ reply }>{ reply.user.name }への返信: (or <a onclick={ clearReply }>キャンセル</a>)</p> <p if={ reply }><b>&gt;&gt;{ reply.index }</b> ({ reply.user.name }): <a onclick={ clearReply }>[x]</a></p>
<textarea ref="text" disabled={ wait }></textarea> <textarea ref="text" disabled={ wait }></textarea>
<button class={ wait: wait } ref="submit" disabled={ wait || (refs.text.value.length == 0) } onclick={ post }> <button class={ wait: wait } ref="submit" disabled={ wait || (refs.text.value.length == 0) } onclick={ post }>
{ wait ? 'やってます' : 'やる' }<mk-ellipsis if={ wait }/> { wait ? 'やってます' : 'やる' }<mk-ellipsis if={ wait }/>

View File

@ -112,6 +112,7 @@
</header> </header>
<div class="body"> <div class="body">
<div class="text" ref="text"> <div class="text" ref="text">
<p class="channel" if={ p.channel != null }><a href={ '/channel/' + p.channel.id }>{ p.channel.title }</a>:</p>
<a class="reply" if={ p.reply_to }> <a class="reply" if={ p.reply_to }>
<i class="fa fa-reply"></i> <i class="fa fa-reply"></i>
</a> </a>
@ -333,6 +334,9 @@
font-weight 400 font-weight 400
font-style normal font-style normal
> .channel
margin 0
> .reply > .reply
margin-right 8px margin-right 8px
color #717171 color #717171

View File

@ -164,6 +164,7 @@
</header> </header>
<div class="body"> <div class="body">
<div class="text" ref="text"> <div class="text" ref="text">
<p class="channel" if={ p.channel != null }><a href={ '/channel/' + p.channel.id }>{ p.channel.title }</a>:</p>
<a class="reply" if={ p.reply_to }> <a class="reply" if={ p.reply_to }>
<i class="fa fa-reply"></i> <i class="fa fa-reply"></i>
</a> </a>
@ -373,6 +374,9 @@
mk-url-preview mk-url-preview
margin-top 8px margin-top 8px
> .channel
margin 0
> .reply > .reply
margin-right 8px margin-right 8px
color #717171 color #717171