From 9ba00dc29c5d552cf7e3e7e3141d101ef003d870 Mon Sep 17 00:00:00 2001 From: nquidox Date: Sun, 26 Oct 2025 21:32:05 +0300 Subject: [PATCH 1/5] image storage url added --- src/main.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/main.js b/src/main.js index 753d4a0..ee40f96 100644 --- a/src/main.js +++ b/src/main.js @@ -11,6 +11,8 @@ export const BASE_URL = 'https://api.nqws.ru/api/v2' // export const BASE_URL = 'http://localhost:9090/api/v2' export const BASE_MANDARAKE_LINK = 'https://order.mandarake.co.jp/order/listPage/list?soldOut=1&keyword=' +// export const IMAGE_STORAGE_URL = 'http://localhost:9280' +export const IMAGE_STORAGE_URL = 'https://images.nqws.ru' app.use(createPinia()) app.use(router) From a1ed5429a468e51ce32c76931c3bff3e9b253f79 Mon Sep 17 00:00:00 2001 From: nquidox Date: Sun, 26 Oct 2025 21:32:35 +0300 Subject: [PATCH 2/5] upload response + get url refactor --- src/api/merchImages.js | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) diff --git a/src/api/merchImages.js b/src/api/merchImages.js index 19a8f77..61bc9f0 100644 --- a/src/api/merchImages.js +++ b/src/api/merchImages.js @@ -1,6 +1,10 @@ import { apiClient } from '@/services/apiClient.js' +import { useAuthStore } from '@/stores/authStore.js' +import { IMAGE_STORAGE_URL } from '@/main.js' export const useMerchImagesApi = () => { + const authStore = useAuthStore() + const uploadImage = async (uuid, file) => { const formData = new FormData() formData.append('file', file) @@ -13,28 +17,30 @@ export const useMerchImagesApi = () => { throw new Error(`Upload failed: ${response.status}`) } - return response.data + const { fullImage, thumbnail } = response.data + + return { + fullImage, + thumbnail, + } } catch (error) { console.error('Upload failed:', error) throw error } } - const getImageUrl = async (uuid, type) => { - try { - const response = await apiClient.get(`/merch/images/${uuid}`, { type }) - console.log(response.data.link) + const getImageUrl = (merchUuid, type = 'full') => { + const userUuid = authStore.userUuid; + if (!userUuid) throw new Error('userUuid not found in store'); - if (response.status !== 200) { - throw new Error(`Get image failed: ${response.status}`) - } - - return response.data.link - } catch (error) { - console.error('Get image failed:', error) - throw error + const allowedTypes = ['full', 'thumbnail']; + if (!allowedTypes.includes(type)) { + throw new Error(`Invalid type: ${type}. Allowed values: ${allowedTypes.join(', ')}`); } - } + + return `${IMAGE_STORAGE_URL}/merchImages/${userUuid}/${merchUuid}?type=${type}`; + }; + const deleteImage = async (uuid) => { try { From 51436141a4d21c69af37ac88e01683f00c8527cf Mon Sep 17 00:00:00 2001 From: nquidox Date: Sun, 26 Oct 2025 21:32:51 +0300 Subject: [PATCH 3/5] jwt parse for user uuid --- src/stores/authStore.js | 34 +++++++++++++++++++++++++++++++--- 1 file changed, 31 insertions(+), 3 deletions(-) diff --git a/src/stores/authStore.js b/src/stores/authStore.js index 96bb522..7cdfc82 100644 --- a/src/stores/authStore.js +++ b/src/stores/authStore.js @@ -3,11 +3,28 @@ import { computed, ref } from 'vue' import { apiClient } from '@/services/apiClient' import router from '@/router/index.js' +function parseJwt(token) { + try { + const base64Url = token.split('.')[1] + const base64 = base64Url.replace(/-/g, '+').replace(/_/g, '/') + const jsonPayload = decodeURIComponent( + atob(base64) + .split('') + .map(c => '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)) + .join('') + ) + return JSON.parse(jsonPayload) + } catch (e) { + console.error('Invalid JWT:', e) + return null + } +} + export const useAuthStore = defineStore('auth', () => { // state const accessToken = ref(localStorage.getItem('accessToken')) + const userUuid = ref(localStorage.getItem('userUuid') || null) const user = ref(null) - const activeTab = ref('signin') // getters @@ -16,10 +33,20 @@ export const useAuthStore = defineStore('auth', () => { // actions const setToken = (token) => { accessToken.value = token + if (token) { localStorage.setItem('accessToken', token) + + const decoded = parseJwt(token) + const uuid = decoded?.sub + if (uuid) { + userUuid.value = uuid + localStorage.setItem('userUuid', uuid) + } } else { localStorage.removeItem('accessToken') + localStorage.removeItem('userUuid') + userUuid.value = null } } @@ -68,7 +95,7 @@ export const useAuthStore = defineStore('auth', () => { const response = await apiClient.get('/user/') return response.data } catch (error) { - console.error('Register error:', error) + console.error('User info error:', error) } } @@ -77,12 +104,13 @@ export const useAuthStore = defineStore('auth', () => { const response = await apiClient.get('/user/auth/current-session') return response.data } catch (error) { - console.error('Register error:', error) + console.error('Current session error:', error) } } return { accessToken, + userUuid, user, isAuthenticated, activeTab, From 339abe4c84f086120b5da7458473065e5137e479 Mon Sep 17 00:00:00 2001 From: nquidox Date: Sun, 26 Oct 2025 21:33:06 +0300 Subject: [PATCH 4/5] get image update --- .../CollectionView/CollectionMerchCard.vue | 17 ++++++++++---- src/views/DetailsView/DetailsViewImages.vue | 23 +++++++++++++------ 2 files changed, 28 insertions(+), 12 deletions(-) diff --git a/src/views/CollectionView/CollectionMerchCard.vue b/src/views/CollectionView/CollectionMerchCard.vue index 513daea..bb90992 100644 --- a/src/views/CollectionView/CollectionMerchCard.vue +++ b/src/views/CollectionView/CollectionMerchCard.vue @@ -15,22 +15,29 @@ const fileList = ref([]) onMounted(async () => { try { - const imgUrl = await getImageUrl(props.merch.merch_uuid, 'thumbnail') + const imgUrl = getImageUrl(props.merch.merch_uuid, 'thumbnail') + + await new Promise((resolve, reject) => { + const img = new Image() + img.src = imgUrl + img.onload = () => resolve(imgUrl) + img.onerror = () => reject(new Error('Image not found')) + }) + fileList.value = [ { - name: 'full.jpg', + name: 'thumbnail.jpg', url: imgUrl, status: 'finished', }, ] } catch (error) { fileList.value = [] - if (!error.message?.includes('404')) { - console.error('Error getting image: ', error) + if (!error.message.includes('404')) { + console.error('Error getting thumbnail: ', error) } } }) -