api settings linked browser and docs

This commit is contained in:
vabene1111
2025-06-06 14:50:29 +02:00
parent d1a69dac90
commit 23c4c2e543
2 changed files with 49 additions and 24 deletions

View File

@@ -1,7 +1,7 @@
<template> <template>
<v-col cols="12" md="6" lg="4"> <v-col :cols="props.cols" :md="props.md" :lg="props.lg">
<v-card :prepend-icon="props.prependIcon" :title="props.title" :subtitle="props.subtitle" variant="outlined" elevation="1" <v-card :prepend-icon="props.prependIcon" :title="props.title" :subtitle="props.subtitle" variant="outlined" elevation="1"
:to="props.to" :to="props.to" :link="isLink" :href="props.href"
append-icon="fa-solid fa-arrow-right"> append-icon="fa-solid fa-arrow-right">
</v-card> </v-card>
</v-col> </v-col>
@@ -9,8 +9,7 @@
<script setup lang="ts"> <script setup lang="ts">
import {EditorSupportedModels, GenericModel, getGenericModelFromString} from "@/types/Models.ts"; import {computed, onBeforeMount, PropType, ref, watch} from "vue";
import {onBeforeMount, PropType, ref, watch} from "vue";
import {useI18n} from "vue-i18n"; import {useI18n} from "vue-i18n";
import type { RouteLocationRaw } from 'vue-router'; import type { RouteLocationRaw } from 'vue-router';
@@ -20,10 +19,18 @@ const props = defineProps({
prependIcon: {type: String, default: ''}, prependIcon: {type: String, default: ''},
title: {type: String, default: ''}, title: {type: String, default: ''},
subtitle: {type: String, default: ''}, subtitle: {type: String, default: ''},
to: {type: {} as PropType<RouteLocationRaw> } to: {type: {} as PropType<RouteLocationRaw> },
href: {type: String, default: ''},
cols: {type: Number, default: 12 },
md: {type: Number, default: 6 },
lg: {type: Number, default: 4 },
}) })
const isLink = computed(() => {
return props.href != '' && props.to == undefined
})
</script> </script>

View File

@@ -3,34 +3,50 @@
<p class="text-h6">{{ $t('API') }}</p> <p class="text-h6">{{ $t('API') }}</p>
<v-divider class="mb-3"></v-divider> <v-divider class="mb-3"></v-divider>
<v-alert color="error" variant="tonal"> <v-row>
The API is made for developers to interact with the application. <database-link-col prepend-icon="fa-solid fa-terminal" :href="useDjangoUrls().getDjangoUrl('api')" :lg="6" :title="$t('API Browser')"></database-link-col>
It is possible to break things using the API so be careful and create a backup first. <database-link-col prepend-icon="fa-solid fa-laptop-code" :href="useDjangoUrls().getDjangoUrl('/docs/api/')" :lg="6"
The API definition can and will change in the future, make sure to read the changelog to spot changes early :title="$t('API Dokumentation')"></database-link-col>
on. </v-row>
</v-alert>
Authentication works by proving the word <code>Bearer</code> followed by an API Token as a request Authorization <v-row>
header as shown below. <br/> <v-col>
<code>Authorization: Bearer TOKEN</code> -or-<br/>
<code>curl -X GET http://your.domain.com/api/recipes/ -H 'Authorization:
Bearer TOKEN'</code>
<br/> <v-alert color="error" variant="tonal">
<br/> The API is made for developers to interact with the application.
You can have multiple tokens and each token can have its own scope. Currently there is <code>read</code>, <code>write</code> It is possible to break things using the API so be careful and create a backup first.
and <code>bookmarklet</code>. The API definition can and will change in the future, make sure to read the changelog to spot changes early
Read and write do what the name says, the bookmarklet scope is only used for the bookmarklet to limit access to on.
it. </v-alert>
</v-col>
</v-row>
<v-alert color="warning" variant="tonal">Make sure to save your token after creation as they cannot be viewed afterwards.</v-alert> <v-row>
<v-col>
Authentication works by proving the word <code>Bearer</code> followed by an API Token as a request Authorization
header as shown below. <br/>
<code>Authorization: Bearer TOKEN</code> -or-<br/>
<code>curl -X GET http://your.domain.com/api/recipes/ -H 'Authorization:
Bearer TOKEN'</code>
<br/>
<br/>
You can have multiple tokens and each token can have its own scope. Currently there is <code>read</code>, <code>write</code>
and <code>bookmarklet</code>.
Read and write do what the name says, the bookmarklet scope is only used for the bookmarklet to limit access to
it.
<v-alert color="warning" variant="tonal">Make sure to save your token after creation as they cannot be viewed afterwards.</v-alert>
</v-col>
</v-row>
<v-btn prepend-icon="$create" color="create" class="mt-2">{{ $t('New') }} <v-btn prepend-icon="$create" color="create" class="mt-2">{{ $t('New') }}
<model-edit-dialog model="AccessToken" @create="loadAccessTokens()" :close-after-create="false"></model-edit-dialog> <model-edit-dialog model="AccessToken" @create="loadAccessTokens()" :close-after-create="false"></model-edit-dialog>
</v-btn> </v-btn>
<v-list class="mt-2" border> <v-list class="mt-2" border>
<v-list-item v-for="at in accessTokenList" > <v-list-item v-for="at in accessTokenList">
<v-list-item-title>{{ at.token }}</v-list-item-title> <v-list-item-title>{{ at.token }}</v-list-item-title>
<v-list-item-subtitle>Scope {{ at.scope }} <v-list-item-subtitle>Scope {{ at.scope }}
Expires {{ DateTime.fromJSDate(at.expires).toLocaleString(DateTime.DATE_FULL) }} Expires {{ DateTime.fromJSDate(at.expires).toLocaleString(DateTime.DATE_FULL) }}
@@ -57,6 +73,8 @@ import {AccessToken, ApiApi} from "@/openapi";
import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore"; import {ErrorMessageType, useMessageStore} from "@/stores/MessageStore";
import {DateTime} from "luxon"; import {DateTime} from "luxon";
import ModelEditDialog from "@/components/dialogs/ModelEditDialog.vue"; import ModelEditDialog from "@/components/dialogs/ModelEditDialog.vue";
import DatabaseLinkCol from "@/components/display/DatabaseLinkCol.vue";
import {useDjangoUrls} from "@/composables/useDjangoUrls.ts";
const accessTokenList = ref([] as AccessToken[]) const accessTokenList = ref([] as AccessToken[])