refactor: move to new lfk ts client

This commit is contained in:
Philipp Dormann 2025-03-18 00:05:04 +01:00
parent d503061604
commit 865058c8bb
Signed by: philipp
GPG Key ID: 3BB9ADD52DCA4314
5 changed files with 119 additions and 100 deletions

View File

@ -9,6 +9,7 @@
}, },
"dependencies": { "dependencies": {
"@fontsource/athiti": "5.2.5", "@fontsource/athiti": "5.2.5",
"@odit/lfk-client": "^0.0.1",
"@tailwindcss/vite": "4.0.14", "@tailwindcss/vite": "4.0.14",
"bwip-js": "4.5.2", "bwip-js": "4.5.2",
"marked": "15.0.7", "marked": "15.0.7",

15
pnpm-lock.yaml generated
View File

@ -11,6 +11,9 @@ importers:
'@fontsource/athiti': '@fontsource/athiti':
specifier: 5.2.5 specifier: 5.2.5
version: 5.2.5 version: 5.2.5
'@odit/lfk-client':
specifier: ^0.0.1
version: 0.0.1
'@tailwindcss/vite': '@tailwindcss/vite':
specifier: 4.0.14 specifier: 4.0.14
version: 4.0.14(vite@6.2.2(@types/node@18.11.18)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.6.1)) version: 4.0.14(vite@6.2.2(@types/node@18.11.18)(jiti@2.4.2)(lightningcss@1.29.2)(yaml@2.6.1))
@ -368,6 +371,9 @@ packages:
'@fontsource/athiti@5.2.5': '@fontsource/athiti@5.2.5':
resolution: {integrity: sha512-vHoAKBBw+wI4y3bGOkiogOkgcoLH7+SWtNNo/nBQ1XfhvfRPX/91xGtclEdwqUlbOJTCkNzEecdKChJQ5MsDFg==} resolution: {integrity: sha512-vHoAKBBw+wI4y3bGOkiogOkgcoLH7+SWtNNo/nBQ1XfhvfRPX/91xGtclEdwqUlbOJTCkNzEecdKChJQ5MsDFg==}
'@hey-api/client-fetch@0.8.3':
resolution: {integrity: sha512-EBVa8wwUMyBSeQ32PtCz6u5bFQZIMAufvwCT1ZtpjqT3caJQEza4NokbGU50q1ZVrMsM5Ot6GuDNJOF3TMo26Q==}
'@iarna/toml@2.2.5': '@iarna/toml@2.2.5':
resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==}
@ -586,6 +592,9 @@ packages:
'@octokit/types@13.8.0': '@octokit/types@13.8.0':
resolution: {integrity: sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==} resolution: {integrity: sha512-x7DjTIbEpEWXK99DMd01QfWy0hd5h4EN+Q7shkdKds3otGQP+oWE/y0A76i1OvH9fygo4ddvNf7ZvF0t78P98A==}
'@odit/lfk-client@0.0.1':
resolution: {integrity: sha512-DD3ofUIl/Jv6pznJWYevKAbMWMY9GSecyJeNT06izKfko6jsMyOlZBwGnXrydeh8+Dh274/j/GoFA9rWqPxpbQ==}
'@pnpm/config.env-replace@1.1.0': '@pnpm/config.env-replace@1.1.0':
resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==} resolution: {integrity: sha512-htyl8TWnKL7K/ESFa1oW2UB5lVDxuF5DpM7tBi6Hu2LNL3mWkIzNLG6N4zoCUP1lCKNxWy/3iu8mS8MvToGd6w==}
engines: {node: '>=12.22.0'} engines: {node: '>=12.22.0'}
@ -2433,6 +2442,8 @@ snapshots:
'@fontsource/athiti@5.2.5': {} '@fontsource/athiti@5.2.5': {}
'@hey-api/client-fetch@0.8.3': {}
'@iarna/toml@2.2.5': {} '@iarna/toml@2.2.5': {}
'@inquirer/checkbox@4.1.4(@types/node@18.11.18)': '@inquirer/checkbox@4.1.4(@types/node@18.11.18)':
@ -2654,6 +2665,10 @@ snapshots:
dependencies: dependencies:
'@octokit/openapi-types': 23.0.1 '@octokit/openapi-types': 23.0.1
'@odit/lfk-client@0.0.1':
dependencies:
'@hey-api/client-fetch': 0.8.3
'@pnpm/config.env-replace@1.1.0': {} '@pnpm/config.env-replace@1.1.0': {}
'@pnpm/network.ca-file@1.0.2': '@pnpm/network.ca-file@1.0.2':

View File

@ -490,12 +490,13 @@
</template> </template>
<script setup> <script setup>
import { reactive, ref } from "vue";
import { TYPE, useToast } from "vue-toastification";
import axios from "redaxios";
import { toCanvas } from "bwip-js";
import Footer from "@/components/Footer.vue"; import Footer from "@/components/Footer.vue";
import { useI18n } from 'vue-i18n' import { runnerSelfServiceControllerGet, runnerSelfServiceControllerGetScans, runnerSelfServiceControllerRemove } from "@odit/lfk-client";
import { toCanvas } from "bwip-js";
import axios from "redaxios";
import { reactive, ref } from "vue";
import { useI18n } from 'vue-i18n';
import { TYPE, useToast } from "vue-toastification";
const { t } = useI18n() const { t } = useI18n()
const loadstate = ref("loading") const loadstate = ref("loading")
const mode = ref("") const mode = ref("")
@ -570,46 +571,42 @@ function getReadableDistance(distance) {
return `${m} m` return `${m} m`
} }
axios runnerSelfServiceControllerGet({ path: { jwt: accesstoken } }).then(({ data }) => {
.get(`${config.baseurl}api/runners/me/${accesstoken}`) loadstate.value = "loaded"
.then(({ data }) => { state.phone = data.phone;
loadstate.value = "loaded" state.email = data.email;
state.phone = data.phone; state.firstname = data.firstname;
state.email = data.email; state.middlename = data.middlename;
state.firstname = data.firstname; state.lastname = data.lastname;
state.middlename = data.middlename; state.group = data.group;
state.lastname = data.lastname; state.sponsorings = data.distanceDonations;
state.group = data.group; state.fullobject = data;
state.sponsorings = data.distanceDonations; state.barcode = textToBase64Barcode(data.id ?? "???");
state.fullobject = data; })
state.barcode = textToBase64Barcode(data.id ?? "???");
})
.catch((error) => { .catch((error) => {
loadstate = "error" loadstate = "error"
toast.clear(); toast.clear();
toast.error(t('profil_konnte_nicht_geladen_werden')); toast.error(t('profil_konnte_nicht_geladen_werden'));
}); });
axios runnerSelfServiceControllerGetScans({ path: { jwt: accesstoken } }).then(({ data }) => {
.get(`${config.baseurl}api/runners/me/${accesstoken}/scans`) let counter = 0
.then(({ data }) => { data.map(function (s) {
let counter = 0 if (counter === 0) {
data.map(function (s) { s.lapTime_readable = t('first_lap')
if (counter === 0) { } else {
s.lapTime_readable = t('first_lap') s.lapTime_readable =
} else { Math.floor(s.lapTime / 60) +
s.lapTime_readable = "min " +
Math.floor(s.lapTime / 60) + (Math.floor(s.lapTime % 60) + "").padStart(2, "0") +
"min " + "s";
(Math.floor(s.lapTime % 60) + "").padStart(2, "0") + }
"s"; s.distance_readable = getReadableDistance(s.distance);
} counter++;
s.distance_readable = getReadableDistance(s.distance); return s;
counter++; });
return s; data.filter((s) => s.valid === true);
}); state.scans = data;
data.filter((s) => s.valid === true); })
state.scans = data;
})
.catch((error) => { .catch((error) => {
toast.error(t('profil_konnte_nicht_geladen_werden')); toast.error(t('profil_konnte_nicht_geladen_werden'));
}); });
@ -624,26 +621,20 @@ function addSponsoring() {
"address": {} "address": {}
} }
console.log(postdata); console.log(postdata);
axios // TODO: implement: donationControllerPostDistance({body:{}})
.post(`${config.baseurl}api/donors`, postdata)
.then(({ data }) => {
console.log(data);
})
.catch((error) => {
//
});
} }
function delete_me() { function delete_me() {
toast.clear(); toast.clear();
toast(t('profil_wird_geloescht')); toast(t('profil_wird_geloescht'));
let url = `${config.baseurl}api/runners/me/${accesstoken}?force=true`; runnerSelfServiceControllerRemove({
axios path: {
.delete(url) jwt: accesstoken
.then(() => { }, query: { force: true }
toast.clear(); }).then(() => {
toast(t('alle_daten_geloescht')); toast.clear();
location.replace(`/`); toast(t('alle_daten_geloescht'));
}) location.replace(`/`);
})
.catch((error) => { .catch((error) => {
toast.clear(); toast.clear();
toast.error(t('profil_konnte_nicht_geloescht_werden')); toast.error(t('profil_konnte_nicht_geloescht_werden'));

View File

@ -59,12 +59,12 @@
</template> </template>
<script setup> <script setup>
import { computed, ref, reactive } from "vue";
import axios from "redaxios";
import isEmail from 'validator/es/lib/isEmail';
import { TYPE, useToast } from "vue-toastification";
import Footer from "@/components/Footer.vue"; import Footer from "@/components/Footer.vue";
import { useI18n } from 'vue-i18n' import { runnerSelfServiceControllerRequestNewToken } from "@odit/lfk-client";
import isEmail from 'validator/es/lib/isEmail';
import { computed, reactive, ref } from "vue";
import { useI18n } from 'vue-i18n';
import { TYPE, useToast } from "vue-toastification";
const { t } = useI18n() const { t } = useI18n()
let user_email = ref(""); let user_email = ref("");
@ -79,11 +79,10 @@ function resendMail() {
if (isEmail(user_email.value)) { if (isEmail(user_email.value)) {
toast(t('login_link_is_requested')); toast(t('login_link_is_requested'));
const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2); const browserlocale = ((navigator.languages && navigator.languages[0]) || '').substr(0, 2);
axios.post(`${config.baseurl}api/runners/login?mail=${user_email.value}&locale=${browserlocale}`) runnerSelfServiceControllerRequestNewToken({ query: { locale: browserlocale, mail: user_email.value } }).then(({ data }) => {
.then(({ data }) => { console.log(data);
console.log(data); toast(t('login_link_gesendet_an_user_email_value') + user_email.value);
toast(t('login_link_gesendet_an_user_email_value') + user_email.value); })
})
.catch((error) => { .catch((error) => {
console.log(error); console.log(error);
toast(t('error_requesting_the_login_link'), { type: TYPE.ERROR }); toast(t('error_requesting_the_login_link'), { type: TYPE.ERROR });

View File

@ -317,27 +317,24 @@
</template> </template>
<script setup> <script setup>
import { computed, ref, reactive } from "vue"; import Footer from "@/components/Footer.vue";
import axios from "redaxios"; import { runnerSelfServiceControllerGetSelfserviceOrg, runnerSelfServiceControllerRegisterOrganizationRunner, runnerSelfServiceControllerRegisterRunner } from "@odit/lfk-client";
import isEmail from "validator/es/lib/isEmail"; import isEmail from "validator/es/lib/isEmail";
import isMobilePhone from "validator/es/lib/isMobilePhone"; import isMobilePhone from "validator/es/lib/isMobilePhone";
import isPostalCode from "validator/es/lib/isPostalCode"; import isPostalCode from "validator/es/lib/isPostalCode";
import { computed, reactive, ref } from "vue";
import { useI18n } from 'vue-i18n';
import { TYPE, useToast } from "vue-toastification"; import { TYPE, useToast } from "vue-toastification";
import Footer from "@/components/Footer.vue";
import { useI18n } from 'vue-i18n'
const { t } = useI18n() const { t } = useI18n()
const props = defineProps({ const props = defineProps({
token: String, token: String,
}); });
if (props.token) { if (props.token) {
axios runnerSelfServiceControllerGetSelfserviceOrg({ path: { token: props.token } }).then(({ data }) => {
.get(`${config.baseurl}api/organizations/selfservice/${props.token}`) state.org_name = data.name;
.then(({ data }) => { state.org_teams = data.teams;
state.org_name = data.name; org_team.value = data.teams[0]?.id;
state.org_teams = data.teams; })
org_team.value = data.teams[0]?.id;
})
.catch((error) => { .catch((error) => {
console.log(error); console.log(error);
}); });
@ -400,9 +397,11 @@ function login() {
firstname: userdetails.value.firstname, firstname: userdetails.value.firstname,
middlename: userdetails.value.middlename, middlename: userdetails.value.middlename,
lastname: userdetails.value.lastname, lastname: userdetails.value.lastname,
phone: userdetails.value.phone,
address: {}, address: {},
}; };
if (userdetails.value.phone !== "") {
postdata.phone = userdetails.value.phone
}
if (provide_address.value === true) { if (provide_address.value === true) {
postdata.address = { postdata.address = {
address1: userdetails.value.address.street, address1: userdetails.value.address.street,
@ -420,28 +419,42 @@ function login() {
(navigator.languages && navigator.languages[0]) || (navigator.languages && navigator.languages[0]) ||
"" ""
).substr(0, 2); ).substr(0, 2);
let url = `${config.baseurl}api/runners/register/?locale=${browserlocale}`;
if (props.token) {
url = `${config.baseurl}api/runners/register/${props.token}/?locale=${browserlocale}`;
}
registrationState.value = "loading"; registrationState.value = "loading";
axios if (props.token) {
.post(url, postdata) runnerSelfServiceControllerRegisterOrganizationRunner({ path: { token: props.token }, body: postdata, query: { locale: browserlocale } })
.then(() => { .then(() => {
registrationState.value = "registered"; registrationState.value = "registered";
}) })
.catch((error) => { .catch((error) => {
console.log(error); console.log(error);
if (error.data.message === "E-Mail already registered") { if (error.data.message === "E-Mail already registered") {
toast(t('already_registered'), { type: TYPE.ERROR }); toast(t('already_registered'), { type: TYPE.ERROR });
} else if (error.data.message === "Invalid body, check 'errors' property for more info.") { } else if (error.data.message === "Invalid body, check 'errors' property for more info.") {
error.data.errors.forEach(e => { error.data.errors.forEach(e => {
if (e.property === "phone") { if (e.property === "phone") {
toast(t('invalid_input_phone_number_should_be_international_format'), { type: TYPE.ERROR }); toast(t('invalid_input_phone_number_should_be_international_format'), { type: TYPE.ERROR });
} }
}); });
} }
}); });
} else {
runnerSelfServiceControllerRegisterRunner({ body: postdata, query: { locale: browserlocale } })
.then(() => {
registrationState.value = "registered";
})
.catch((error) => {
console.log(error);
if (error.data.message === "E-Mail already registered") {
toast(t('already_registered'), { type: TYPE.ERROR });
} else if (error.data.message === "Invalid body, check 'errors' property for more info.") {
error.data.errors.forEach(e => {
if (e.property === "phone") {
toast(t('invalid_input_phone_number_should_be_international_format'), { type: TYPE.ERROR });
}
});
}
});
}
} }
} }
} }