Merge branch 'master' into patch-player
This commit is contained in:
		
						commit
						9252c59d90
					
				
					 11 changed files with 184 additions and 109 deletions
				
			
		| 
						 | 
				
			
			@ -1,6 +1,8 @@
 | 
			
		|||
<template>
 | 
			
		||||
	<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-if="disablePreview"></router-link>
 | 
			
		||||
	<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else v-user-preview="user.id"></router-link>
 | 
			
		||||
	<span class="mk-avatar" :title="user | acct" :style="style" v-if="disableLink && !disablePreview" v-user-preview="user.id" @click="onClick"></span>
 | 
			
		||||
	<span class="mk-avatar" :title="user | acct" :style="style" v-else-if="disableLink && disablePreview" @click="onClick"></span>
 | 
			
		||||
	<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else-if="!disableLink && !disablePreview" v-user-preview="user.id"></router-link>
 | 
			
		||||
	<router-link class="mk-avatar" :to="user | userPage" :title="user | acct" :target="target" :style="style" v-else-if="!disableLink && disablePreview"></router-link>
 | 
			
		||||
</template>
 | 
			
		||||
 | 
			
		||||
<script lang="ts">
 | 
			
		||||
| 
						 | 
				
			
			@ -15,6 +17,10 @@ export default Vue.extend({
 | 
			
		|||
			required: false,
 | 
			
		||||
			default: null
 | 
			
		||||
		},
 | 
			
		||||
		disableLink: {
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
		},
 | 
			
		||||
		disablePreview: {
 | 
			
		||||
			required: false,
 | 
			
		||||
			default: false
 | 
			
		||||
| 
						 | 
				
			
			@ -35,6 +41,11 @@ export default Vue.extend({
 | 
			
		|||
				borderRadius: this.$store.state.settings.circleIcons ? '100%' : null
 | 
			
		||||
			};
 | 
			
		||||
		}
 | 
			
		||||
	},
 | 
			
		||||
	methods: {
 | 
			
		||||
		onClick(e) {
 | 
			
		||||
			this.$emit('click', e);
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
});
 | 
			
		||||
</script>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,18 +73,19 @@ export default Vue.extend({
 | 
			
		|||
				twttr.ready = loadTweet;
 | 
			
		||||
				(window as any).twttr = twttr;
 | 
			
		||||
			}
 | 
			
		||||
		} else {
 | 
			
		||||
			fetch('/url?url=' + encodeURIComponent(this.url)).then(res => {
 | 
			
		||||
				res.json().then(info => {
 | 
			
		||||
			return;
 | 
			
		||||
		}
 | 
			
		||||
		fetch('/url?url=' + encodeURIComponent(this.url)).then(res => {
 | 
			
		||||
			res.json().then(info => {
 | 
			
		||||
				if (info.url != null) {
 | 
			
		||||
					this.title = info.title;
 | 
			
		||||
					this.description = info.description;
 | 
			
		||||
					this.thumbnail = info.thumbnail;
 | 
			
		||||
					this.player = info.player;
 | 
			
		||||
					this.icon = info.icon;
 | 
			
		||||
					this.sitename = info.sitename;
 | 
			
		||||
 | 
			
		||||
					this.fetching = false;
 | 
			
		||||
				});
 | 
			
		||||
				}
 | 
			
		||||
			});
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -18,7 +18,7 @@
 | 
			
		|||
				<div class="about">
 | 
			
		||||
					<h1 v-if="name != 'Misskey'">{{ name }}</h1>
 | 
			
		||||
					<h1 v-else><img :src="$store.state.device.darkmode ? 'assets/title.dark.svg' : 'assets/title.light.svg'" :alt="name"></h1>
 | 
			
		||||
					<p class="powerd-by" v-if="name != 'Misskey'">%i18n:@powered-by-misskey%</p>
 | 
			
		||||
					<p class="powerd-by" v-if="name != 'Misskey'" v-html="'%i18n:@powered-by-misskey%'"></p>
 | 
			
		||||
					<p class="desc" v-html="description || '%i18n:common.about%'"></p>
 | 
			
		||||
					<a ref="signup" @click="signup">📦 %i18n:@signup%</a>
 | 
			
		||||
				</div>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -6,10 +6,11 @@
 | 
			
		|||
	<div class="banner"
 | 
			
		||||
		:style="$store.state.i.bannerUrl ? `background-image: url(${$store.state.i.bannerUrl})` : ''"
 | 
			
		||||
		title="%i18n:@update-banner%"
 | 
			
		||||
		@click="os.apis.updateBanner"
 | 
			
		||||
		@click="() => os.apis.updateBanner()"
 | 
			
		||||
	></div>
 | 
			
		||||
	<mk-avatar class="avatar" :user="$store.state.i"
 | 
			
		||||
		@click="os.apis.updateAvatar"
 | 
			
		||||
		:disable-link="true"
 | 
			
		||||
		@click="() => os.apis.updateAvatar()"
 | 
			
		||||
		title="%i18n:@update-avatar%"
 | 
			
		||||
	/>
 | 
			
		||||
	<router-link class="name" :to="$store.state.i | userPage">{{ $store.state.i | userName }}</router-link>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										41
									
								
								src/docs/api/entities/drive-folder.yaml
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								src/docs/api/entities/drive-folder.yaml
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,41 @@
 | 
			
		|||
name: "DriveFolder"
 | 
			
		||||
 | 
			
		||||
desc:
 | 
			
		||||
  ja: "ドライブのフォルダを表します。"
 | 
			
		||||
  en: "A folder of Drive."
 | 
			
		||||
 | 
			
		||||
props:
 | 
			
		||||
  id:
 | 
			
		||||
    type: "id"
 | 
			
		||||
    optional: false
 | 
			
		||||
    desc:
 | 
			
		||||
      ja: "フォルダID"
 | 
			
		||||
      en: "The ID of this folder"
 | 
			
		||||
 | 
			
		||||
  createdAt:
 | 
			
		||||
    type: "date"
 | 
			
		||||
    optional: false
 | 
			
		||||
    desc:
 | 
			
		||||
      ja: "作成日時"
 | 
			
		||||
      en: "The created date of this folder"
 | 
			
		||||
 | 
			
		||||
  userId:
 | 
			
		||||
    type: "id(User)"
 | 
			
		||||
    optional: false
 | 
			
		||||
    desc:
 | 
			
		||||
      ja: "所有者ID"
 | 
			
		||||
      en: "The ID of the owner of this folder"
 | 
			
		||||
 | 
			
		||||
  parentId:
 | 
			
		||||
    type: "entity(DriveFolder)"
 | 
			
		||||
    optional: false
 | 
			
		||||
    desc:
 | 
			
		||||
      ja: "親フォルダのID (ルートなら null)"
 | 
			
		||||
      en: "The ID of parent folder"
 | 
			
		||||
 | 
			
		||||
  name:
 | 
			
		||||
    type: "string"
 | 
			
		||||
    optional: false
 | 
			
		||||
    desc:
 | 
			
		||||
      ja: "フォルダ名"
 | 
			
		||||
      en: "The name of this folder"
 | 
			
		||||
| 
						 | 
				
			
			@ -10,7 +10,7 @@ import DriveFileThumbnail, { deleteDriveFileThumbnail } from './drive-file-thumb
 | 
			
		|||
 | 
			
		||||
const DriveFile = monkDb.get<IDriveFile>('driveFiles.files');
 | 
			
		||||
DriveFile.createIndex('md5');
 | 
			
		||||
DriveFile.createIndex('metadata.uri', { sparse: true, unique: true });
 | 
			
		||||
DriveFile.createIndex(['metadata.uri', 'metadata.userId'], { sparse: true, unique: true });
 | 
			
		||||
export default DriveFile;
 | 
			
		||||
 | 
			
		||||
export const DriveFileChunk = monkDb.get('driveFiles.chunks');
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -7,7 +7,7 @@ export default async (job: bq.Job, done: any): Promise<void> => {
 | 
			
		|||
		await request(job.data.user, job.data.to, job.data.content);
 | 
			
		||||
		done();
 | 
			
		||||
	} catch (res) {
 | 
			
		||||
		if (!res.hasOwnProperty('statusCode')) {
 | 
			
		||||
		if (res == null || !res.hasOwnProperty('statusCode')) {
 | 
			
		||||
			console.warn(`deliver failed (unknown): ${res}`);
 | 
			
		||||
			return done();
 | 
			
		||||
		}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -14,7 +14,9 @@ module.exports = async (ctx: Koa.Context) => {
 | 
			
		|||
 | 
			
		||||
		ctx.body = summary;
 | 
			
		||||
	} catch (e) {
 | 
			
		||||
		ctx.status = 500;
 | 
			
		||||
		ctx.status = 200;
 | 
			
		||||
		ctx.set('Cache-Control', 'max-age=86400, immutable');
 | 
			
		||||
		ctx.body = '{}';
 | 
			
		||||
	}
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -294,16 +294,35 @@ export default async function(
 | 
			
		|||
		metadata.uri = uri;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	const driveFile = isLink
 | 
			
		||||
		? await DriveFile.insert({
 | 
			
		||||
			length: 0,
 | 
			
		||||
			uploadDate: new Date(),
 | 
			
		||||
			md5: hash,
 | 
			
		||||
			filename: detectedName,
 | 
			
		||||
			metadata: metadata,
 | 
			
		||||
			contentType: mime
 | 
			
		||||
		})
 | 
			
		||||
		: await (save(fs.createReadStream(path), detectedName, mime, hash, size, metadata));
 | 
			
		||||
	let driveFile: IDriveFile;
 | 
			
		||||
 | 
			
		||||
	if (isLink) {
 | 
			
		||||
		try {
 | 
			
		||||
			driveFile = await DriveFile.insert({
 | 
			
		||||
				length: 0,
 | 
			
		||||
				uploadDate: new Date(),
 | 
			
		||||
				md5: hash,
 | 
			
		||||
				filename: detectedName,
 | 
			
		||||
				metadata: metadata,
 | 
			
		||||
				contentType: mime
 | 
			
		||||
			});
 | 
			
		||||
		} catch (e) {
 | 
			
		||||
			// duplicate key error (when already registered)
 | 
			
		||||
			if (e.code === 11000) {
 | 
			
		||||
				log(`already registered ${metadata.uri}`);
 | 
			
		||||
 | 
			
		||||
				driveFile = await DriveFile.findOne({
 | 
			
		||||
					'metadata.uri': metadata.uri,
 | 
			
		||||
					'metadata.userId': user._id
 | 
			
		||||
				});
 | 
			
		||||
			} else {
 | 
			
		||||
				console.error(e);
 | 
			
		||||
				throw e;
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
	} else {
 | 
			
		||||
		driveFile = await (save(fs.createReadStream(path), detectedName, mime, hash, size, metadata));
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	log(`drive file has been created ${driveFile._id}`);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue