mirror of
				https://codeberg.org/yeentown/barkey.git
				synced 2025-11-04 07:24:13 +00:00 
			
		
		
		
	wip
This commit is contained in:
		
							parent
							
								
									0009a371c8
								
							
						
					
					
						commit
						fd73fad148
					
				
					 3 changed files with 31 additions and 84 deletions
				
			
		| 
						 | 
				
			
			@ -15,6 +15,8 @@ import Mute from '../../models/mute';
 | 
			
		|||
import pushSw from '../../publishers/push-sw';
 | 
			
		||||
import event from '../../publishers/stream';
 | 
			
		||||
import parse from '../../text/parse';
 | 
			
		||||
import html from '../../text/html';
 | 
			
		||||
import { IApp } from '../../models/app';
 | 
			
		||||
 | 
			
		||||
export default async (user: IUser, content: {
 | 
			
		||||
	createdAt: Date;
 | 
			
		||||
| 
						 | 
				
			
			@ -23,9 +25,14 @@ export default async (user: IUser, content: {
 | 
			
		|||
	repost: IPost;
 | 
			
		||||
	media: IDriveFile[];
 | 
			
		||||
	geo: any;
 | 
			
		||||
	poll: any;
 | 
			
		||||
	viaMobile: boolean;
 | 
			
		||||
	tags: string[];
 | 
			
		||||
}) => new Promise(async (res, rej) => {
 | 
			
		||||
	cw: string;
 | 
			
		||||
	visibility: string;
 | 
			
		||||
	uri?: string;
 | 
			
		||||
	app?: IApp;
 | 
			
		||||
}) => new Promise<IPost>(async (res, rej) => {
 | 
			
		||||
	const tags = content.tags || [];
 | 
			
		||||
 | 
			
		||||
	let tokens = null;
 | 
			
		||||
| 
						 | 
				
			
			@ -53,10 +60,16 @@ export default async (user: IUser, content: {
 | 
			
		|||
		replyId: content.reply ? content.reply._id : null,
 | 
			
		||||
		repostId: content.repost ? content.repost._id : null,
 | 
			
		||||
		text: content.text,
 | 
			
		||||
		textHtml: tokens === null ? null : html(tokens),
 | 
			
		||||
		poll: content.poll,
 | 
			
		||||
		cw: content.cw,
 | 
			
		||||
		tags,
 | 
			
		||||
		userId: user._id,
 | 
			
		||||
		viaMobile: content.viaMobile,
 | 
			
		||||
		geo: content.geo || null,
 | 
			
		||||
		uri: content.uri,
 | 
			
		||||
		appId: content.app ? content.app._id : null,
 | 
			
		||||
		visibility: content.visibility,
 | 
			
		||||
 | 
			
		||||
		// 以下非正規化データ
 | 
			
		||||
		_reply: content.reply ? { userId: content.reply.userId } : null,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,32 +63,26 @@ export default async (actor, activity): Promise<void> => {
 | 
			
		|||
			throw new Error('invalid note');
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		const mediaIds = [];
 | 
			
		||||
		const media = [];
 | 
			
		||||
 | 
			
		||||
		if ('attachment' in note) {
 | 
			
		||||
			note.attachment.forEach(async media => {
 | 
			
		||||
				const created = await createImage(resolver, media);
 | 
			
		||||
				mediaIds.push(created._id);
 | 
			
		||||
				media.push(created);
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		const { window } = new JSDOM(note.content);
 | 
			
		||||
 | 
			
		||||
		await createPost(actor, {
 | 
			
		||||
			channelId: undefined,
 | 
			
		||||
			index: undefined,
 | 
			
		||||
			createdAt: new Date(note.published),
 | 
			
		||||
			mediaIds,
 | 
			
		||||
			replyId: undefined,
 | 
			
		||||
			repostId: undefined,
 | 
			
		||||
			poll: undefined,
 | 
			
		||||
			media,
 | 
			
		||||
			reply: undefined,
 | 
			
		||||
			repost: undefined,
 | 
			
		||||
			text: window.document.body.textContent,
 | 
			
		||||
			textHtml: note.content && createDOMPurify(window).sanitize(note.content),
 | 
			
		||||
			userId: actor._id,
 | 
			
		||||
			appId: null,
 | 
			
		||||
			viaMobile: false,
 | 
			
		||||
			geo: undefined,
 | 
			
		||||
			uri: note.id
 | 
			
		||||
		}, null, null, []);
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3,16 +3,12 @@
 | 
			
		|||
 */
 | 
			
		||||
import $ from 'cafy';
 | 
			
		||||
import deepEqual = require('deep-equal');
 | 
			
		||||
import renderAcct from '../../../../acct/render';
 | 
			
		||||
import config from '../../../../config';
 | 
			
		||||
import html from '../../../../text/html';
 | 
			
		||||
import parse from '../../../../text/parse';
 | 
			
		||||
import Post, { IPost, isValidText, isValidCw } from '../../../../models/post';
 | 
			
		||||
import Post, { IPost, isValidText, isValidCw, pack } from '../../../../models/post';
 | 
			
		||||
import { ILocalUser } from '../../../../models/user';
 | 
			
		||||
import Channel, { IChannel } from '../../../../models/channel';
 | 
			
		||||
import DriveFile from '../../../../models/drive-file';
 | 
			
		||||
import create from '../../../../post/create';
 | 
			
		||||
import distribute from '../../../../post/distribute';
 | 
			
		||||
import create from '../../../../api/post/create';
 | 
			
		||||
import { IApp } from '../../../../models/app';
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Create a post
 | 
			
		||||
| 
						 | 
				
			
			@ -22,7 +18,7 @@ import distribute from '../../../../post/distribute';
 | 
			
		|||
 * @param {any} app
 | 
			
		||||
 * @return {Promise<any>}
 | 
			
		||||
 */
 | 
			
		||||
module.exports = (params, user: ILocalUser, app) => new Promise(async (res, rej) => {
 | 
			
		||||
module.exports = (params, user: ILocalUser, app: IApp) => new Promise(async (res, rej) => {
 | 
			
		||||
	// Get 'visibility' parameter
 | 
			
		||||
	const [visibility = 'public', visibilityErr] = $(params.visibility).optional.string().or(['public', 'unlisted', 'private', 'direct']).$;
 | 
			
		||||
	if (visibilityErr) return rej('invalid visibility');
 | 
			
		||||
| 
						 | 
				
			
			@ -230,82 +226,26 @@ module.exports = (params, user: ILocalUser, app) => new Promise(async (res, rej)
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let tokens = null;
 | 
			
		||||
	if (text) {
 | 
			
		||||
		// Analyze
 | 
			
		||||
		tokens = parse(text);
 | 
			
		||||
 | 
			
		||||
		// Extract hashtags
 | 
			
		||||
		const hashtags = tokens
 | 
			
		||||
			.filter(t => t.type == 'hashtag')
 | 
			
		||||
			.map(t => t.hashtag);
 | 
			
		||||
 | 
			
		||||
		hashtags.forEach(tag => {
 | 
			
		||||
			if (tags.indexOf(tag) == -1) {
 | 
			
		||||
				tags.push(tag);
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	let atMentions = [];
 | 
			
		||||
 | 
			
		||||
	// If has text content
 | 
			
		||||
	if (text) {
 | 
			
		||||
		/*
 | 
			
		||||
				// Extract a hashtags
 | 
			
		||||
				const hashtags = tokens
 | 
			
		||||
					.filter(t => t.type == 'hashtag')
 | 
			
		||||
					.map(t => t.hashtag)
 | 
			
		||||
					// Drop dupulicates
 | 
			
		||||
					.filter((v, i, s) => s.indexOf(v) == i);
 | 
			
		||||
 | 
			
		||||
				// ハッシュタグをデータベースに登録
 | 
			
		||||
				registerHashtags(user, hashtags);
 | 
			
		||||
		*/
 | 
			
		||||
		// Extract an '@' mentions
 | 
			
		||||
		atMentions = tokens
 | 
			
		||||
			.filter(t => t.type == 'mention')
 | 
			
		||||
			.map(renderAcct)
 | 
			
		||||
			// Drop dupulicates
 | 
			
		||||
			.filter((v, i, s) => s.indexOf(v) == i);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// 投稿を作成
 | 
			
		||||
	const post = await create({
 | 
			
		||||
	const post = await create(user, {
 | 
			
		||||
		createdAt: new Date(),
 | 
			
		||||
		channelId: channel ? channel._id : undefined,
 | 
			
		||||
		index: channel ? channel.index + 1 : undefined,
 | 
			
		||||
		mediaIds: files ? files.map(file => file._id) : [],
 | 
			
		||||
		media: files,
 | 
			
		||||
		poll: poll,
 | 
			
		||||
		text: text,
 | 
			
		||||
		textHtml: tokens === null ? null : html(tokens),
 | 
			
		||||
		reply,
 | 
			
		||||
		repost,
 | 
			
		||||
		cw: cw,
 | 
			
		||||
		tags: tags,
 | 
			
		||||
		userId: user._id,
 | 
			
		||||
		appId: app ? app._id : null,
 | 
			
		||||
		app: app,
 | 
			
		||||
		viaMobile: viaMobile,
 | 
			
		||||
		visibility,
 | 
			
		||||
		geo
 | 
			
		||||
	}, reply, repost, atMentions);
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	const postObj = await distribute(user, post.mentions, post);
 | 
			
		||||
	const postObj = await pack(post, user);
 | 
			
		||||
 | 
			
		||||
	// Reponse
 | 
			
		||||
	res({
 | 
			
		||||
		createdPost: postObj
 | 
			
		||||
	});
 | 
			
		||||
 | 
			
		||||
	// Register to search database
 | 
			
		||||
	if (post.text && config.elasticsearch.enable) {
 | 
			
		||||
		const es = require('../../../db/elasticsearch');
 | 
			
		||||
 | 
			
		||||
		es.index({
 | 
			
		||||
			index: 'misskey',
 | 
			
		||||
			type: 'post',
 | 
			
		||||
			id: post._id.toString(),
 | 
			
		||||
			body: {
 | 
			
		||||
				text: post.text
 | 
			
		||||
			}
 | 
			
		||||
		});
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue