summaryrefslogtreecommitdiff
path: root/src/server/web/app/dev
diff options
context:
space:
mode:
authorAkihiko Odaki <nekomanma@pixiv.co.jp>2018-03-29 01:20:40 +0900
committerAkihiko Odaki <nekomanma@pixiv.co.jp>2018-03-29 01:54:41 +0900
commit90f8fe7e538bb7e52d2558152a0390e693f39b11 (patch)
tree0f830887053c8f352b1cd0c13ca715fd14c1f030 /src/server/web/app/dev
parentImplement remote account resolution (diff)
downloadsharkey-90f8fe7e538bb7e52d2558152a0390e693f39b11.tar.gz
sharkey-90f8fe7e538bb7e52d2558152a0390e693f39b11.tar.bz2
sharkey-90f8fe7e538bb7e52d2558152a0390e693f39b11.zip
Introduce processor
Diffstat (limited to 'src/server/web/app/dev')
-rw-r--r--src/server/web/app/dev/script.ts44
-rw-r--r--src/server/web/app/dev/style.styl10
-rw-r--r--src/server/web/app/dev/views/app.vue39
-rw-r--r--src/server/web/app/dev/views/apps.vue37
-rw-r--r--src/server/web/app/dev/views/index.vue10
-rw-r--r--src/server/web/app/dev/views/new-app.vue105
-rw-r--r--src/server/web/app/dev/views/ui.vue20
7 files changed, 265 insertions, 0 deletions
diff --git a/src/server/web/app/dev/script.ts b/src/server/web/app/dev/script.ts
new file mode 100644
index 0000000000..c043813b40
--- /dev/null
+++ b/src/server/web/app/dev/script.ts
@@ -0,0 +1,44 @@
+/**
+ * Developer Center
+ */
+
+import Vue from 'vue';
+import VueRouter from 'vue-router';
+import BootstrapVue from 'bootstrap-vue';
+import 'bootstrap/dist/css/bootstrap.css';
+import 'bootstrap-vue/dist/bootstrap-vue.css';
+
+// Style
+import './style.styl';
+
+import init from '../init';
+
+import Index from './views/index.vue';
+import Apps from './views/apps.vue';
+import AppNew from './views/new-app.vue';
+import App from './views/app.vue';
+import ui from './views/ui.vue';
+
+Vue.use(BootstrapVue);
+
+Vue.component('mk-ui', ui);
+
+/**
+ * init
+ */
+init(launch => {
+ // Init router
+ const router = new VueRouter({
+ mode: 'history',
+ base: '/dev/',
+ routes: [
+ { path: '/', component: Index },
+ { path: '/apps', component: Apps },
+ { path: '/app/new', component: AppNew },
+ { path: '/app/:id', component: App },
+ ]
+ });
+
+ // Launch the app
+ launch(router);
+});
diff --git a/src/server/web/app/dev/style.styl b/src/server/web/app/dev/style.styl
new file mode 100644
index 0000000000..e635897b17
--- /dev/null
+++ b/src/server/web/app/dev/style.styl
@@ -0,0 +1,10 @@
+@import "../app"
+@import "../reset"
+
+// Bootstrapのデザインを崩すので:
+*
+ position initial
+ background-clip initial !important
+
+html
+ background-color #fff
diff --git a/src/server/web/app/dev/views/app.vue b/src/server/web/app/dev/views/app.vue
new file mode 100644
index 0000000000..2c2a3c83ce
--- /dev/null
+++ b/src/server/web/app/dev/views/app.vue
@@ -0,0 +1,39 @@
+<template>
+<mk-ui>
+ <p v-if="fetching">読み込み中</p>
+ <b-card v-if="!fetching" :header="app.name">
+ <b-form-group label="App Secret">
+ <b-input :value="app.secret" readonly/>
+ </b-form-group>
+ </b-card>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+ data() {
+ return {
+ fetching: true,
+ app: null
+ };
+ },
+ watch: {
+ $route: 'fetch'
+ },
+ mounted() {
+ this.fetch();
+ },
+ methods: {
+ fetch() {
+ this.fetching = true;
+ (this as any).api('app/show', {
+ app_id: this.$route.params.id
+ }).then(app => {
+ this.app = app;
+ this.fetching = false;
+ });
+ }
+ }
+});
+</script>
diff --git a/src/server/web/app/dev/views/apps.vue b/src/server/web/app/dev/views/apps.vue
new file mode 100644
index 0000000000..7e0b107a30
--- /dev/null
+++ b/src/server/web/app/dev/views/apps.vue
@@ -0,0 +1,37 @@
+<template>
+<mk-ui>
+ <b-card header="アプリを管理">
+ <b-button to="/app/new" variant="primary">アプリ作成</b-button>
+ <hr>
+ <div class="apps">
+ <p v-if="fetching">読み込み中</p>
+ <template v-if="!fetching">
+ <b-alert v-if="apps.length == 0">アプリなし</b-alert>
+ <b-list-group v-else>
+ <b-list-group-item v-for="app in apps" :key="app.id" :to="`/app/${app.id}`">
+ {{ app.name }}
+ </b-list-group-item>
+ </b-list-group>
+ </template>
+ </div>
+ </b-card>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+ data() {
+ return {
+ fetching: true,
+ apps: []
+ };
+ },
+ mounted() {
+ (this as any).api('my/apps').then(apps => {
+ this.apps = apps;
+ this.fetching = false;
+ });
+ }
+});
+</script>
diff --git a/src/server/web/app/dev/views/index.vue b/src/server/web/app/dev/views/index.vue
new file mode 100644
index 0000000000..3f572b3907
--- /dev/null
+++ b/src/server/web/app/dev/views/index.vue
@@ -0,0 +1,10 @@
+<template>
+<mk-ui>
+ <b-button to="/apps" variant="primary">アプリの管理</b-button>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend();
+</script>
diff --git a/src/server/web/app/dev/views/new-app.vue b/src/server/web/app/dev/views/new-app.vue
new file mode 100644
index 0000000000..344e8468f9
--- /dev/null
+++ b/src/server/web/app/dev/views/new-app.vue
@@ -0,0 +1,105 @@
+<template>
+<mk-ui>
+ <b-card header="アプリケーションの作成">
+ <b-form @submit.prevent="onSubmit" autocomplete="off">
+ <b-form-group label="アプリケーション名" description="あなたのアプリの名称。">
+ <b-form-input v-model="name" type="text" placeholder="ex) Misskey for iOS" autocomplete="off" required/>
+ </b-form-group>
+ <b-form-group label="ID" description="あなたのアプリのID。">
+ <b-input v-model="nid" type="text" pattern="^[a-zA-Z0-9-]{3,30}$" placeholder="ex) misskey-for-ios" autocomplete="off" required/>
+ <p class="info" v-if="nidState == 'wait'" style="color:#999">%fa:spinner .pulse .fw%確認しています...</p>
+ <p class="info" v-if="nidState == 'ok'" style="color:#3CB7B5">%fa:fw check%利用できます</p>
+ <p class="info" v-if="nidState == 'unavailable'" style="color:#FF1161">%fa:fw exclamation-triangle%既に利用されています</p>
+ <p class="info" v-if="nidState == 'error'" style="color:#FF1161">%fa:fw exclamation-triangle%通信エラー</p>
+ <p class="info" v-if="nidState == 'invalid-format'" style="color:#FF1161">%fa:fw exclamation-triangle%a~z、A~Z、0~9、-(ハイフン)が使えます</p>
+ <p class="info" v-if="nidState == 'min-range'" style="color:#FF1161">%fa:fw exclamation-triangle%3文字以上でお願いします!</p>
+ <p class="info" v-if="nidState == 'max-range'" style="color:#FF1161">%fa:fw exclamation-triangle%30文字以内でお願いします</p>
+ </b-form-group>
+ <b-form-group label="アプリの概要" description="あなたのアプリの簡単な説明や紹介。">
+ <b-textarea v-model="description" placeholder="ex) Misskey iOSクライアント。" autocomplete="off" required></b-textarea>
+ </b-form-group>
+ <b-form-group label="コールバックURL (オプション)" description="ユーザーが認証フォームで認証した際にリダイレクトするURLを設定できます。">
+ <b-input v-model="cb" type="url" placeholder="ex) https://your.app.example.com/callback.php" autocomplete="off"/>
+ </b-form-group>
+ <b-card header="権限">
+ <b-form-group description="ここで要求した機能だけがAPIからアクセスできます。">
+ <b-alert show variant="warning">%fa:exclamation-triangle%アプリ作成後も変更できますが、新たな権限を付与する場合、その時点で関連付けられているユーザーキーはすべて無効になります。</b-alert>
+ <b-form-checkbox-group v-model="permission" stacked>
+ <b-form-checkbox value="account-read">アカウントの情報を見る。</b-form-checkbox>
+ <b-form-checkbox value="account-write">アカウントの情報を操作する。</b-form-checkbox>
+ <b-form-checkbox value="post-write">投稿する。</b-form-checkbox>
+ <b-form-checkbox value="reaction-write">リアクションしたりリアクションをキャンセルする。</b-form-checkbox>
+ <b-form-checkbox value="following-write">フォローしたりフォロー解除する。</b-form-checkbox>
+ <b-form-checkbox value="drive-read">ドライブを見る。</b-form-checkbox>
+ <b-form-checkbox value="drive-write">ドライブを操作する。</b-form-checkbox>
+ <b-form-checkbox value="notification-read">通知を見る。</b-form-checkbox>
+ <b-form-checkbox value="notification-write">通知を操作する。</b-form-checkbox>
+ </b-form-checkbox-group>
+ </b-form-group>
+ </b-card>
+ <hr>
+ <b-button type="submit" variant="primary">アプリ作成</b-button>
+ </b-form>
+ </b-card>
+</mk-ui>
+</template>
+
+<script lang="ts">
+import Vue from 'vue';
+export default Vue.extend({
+ data() {
+ return {
+ name: '',
+ nid: '',
+ description: '',
+ cb: '',
+ nidState: null,
+ permission: []
+ };
+ },
+ watch: {
+ nid() {
+ if (this.nid == null || this.nid == '') {
+ this.nidState = null;
+ return;
+ }
+
+ const err =
+ !this.nid.match(/^[a-zA-Z0-9\-]+$/) ? 'invalid-format' :
+ this.nid.length < 3 ? 'min-range' :
+ this.nid.length > 30 ? 'max-range' :
+ null;
+
+ if (err) {
+ this.nidState = err;
+ return;
+ }
+
+ this.nidState = 'wait';
+
+ (this as any).api('app/name_id/available', {
+ name_id: this.nid
+ }).then(result => {
+ this.nidState = result.available ? 'ok' : 'unavailable';
+ }).catch(err => {
+ this.nidState = 'error';
+ });
+ }
+ },
+ methods: {
+ onSubmit() {
+ (this as any).api('app/create', {
+ name: this.name,
+ name_id: this.nid,
+ description: this.description,
+ callback_url: this.cb,
+ permission: this.permission
+ }).then(() => {
+ location.href = '/apps';
+ }).catch(() => {
+ alert('アプリの作成に失敗しました。再度お試しください。');
+ });
+ }
+ }
+});
+</script>
diff --git a/src/server/web/app/dev/views/ui.vue b/src/server/web/app/dev/views/ui.vue
new file mode 100644
index 0000000000..4a0fcee635
--- /dev/null
+++ b/src/server/web/app/dev/views/ui.vue
@@ -0,0 +1,20 @@
+<template>
+<div>
+ <b-navbar toggleable="md" type="dark" variant="info">
+ <b-navbar-brand>Misskey Developers</b-navbar-brand>
+ <b-navbar-nav>
+ <b-nav-item to="/">Home</b-nav-item>
+ <b-nav-item to="/apps">Apps</b-nav-item>
+ </b-navbar-nav>
+ </b-navbar>
+ <main>
+ <slot></slot>
+ </main>
+</div>
+</template>
+
+<style lang="stylus" scoped>
+main
+ padding 32px
+ max-width 700px
+</style>