Merge branch 'master' into patch-player
This commit is contained in:
@ -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}`);
|
||||
|
||||
|
Reference in New Issue
Block a user