Добавлены новые зависимости, обновлены стили и улучшена структура проекта. Обновлен README с описанием функционала и технологий. Реализована анимация и адаптивный дизайн. Настроена авторизация с использованием Apollo Client.
This commit is contained in:
78
src/services/s3-service.ts
Normal file
78
src/services/s3-service.ts
Normal file
@ -0,0 +1,78 @@
|
||||
interface S3Config {
|
||||
accessKeyId: string
|
||||
secretAccessKey: string
|
||||
region: string
|
||||
endpoint: string
|
||||
bucket: string
|
||||
}
|
||||
|
||||
const s3Config: S3Config = {
|
||||
accessKeyId: 'I6XD2OR7YO2ZN6L6Z629',
|
||||
secretAccessKey: '9xCOoafisG0aB9lJNvdLO1UuK73fBvMcpHMdijrJ',
|
||||
region: 'ru-1',
|
||||
endpoint: 'https://s3.twcstorage.ru',
|
||||
bucket: '617774af-sfera'
|
||||
}
|
||||
|
||||
export class S3Service {
|
||||
private static async createSignedUrl(fileName: string, fileType: string): Promise<string> {
|
||||
// Для простоты пока используем прямую загрузку через fetch
|
||||
// В продакшене лучше генерировать signed URLs на backend
|
||||
const timestamp = Date.now()
|
||||
const key = `avatars/${timestamp}-${fileName}`
|
||||
|
||||
return key
|
||||
}
|
||||
|
||||
static async uploadAvatar(file: File, userId: string): Promise<string> {
|
||||
const fileName = `${userId}-${Date.now()}.${file.name.split('.').pop()}`
|
||||
const key = `avatars/${fileName}`
|
||||
|
||||
try {
|
||||
// Создаем FormData для загрузки
|
||||
const formData = new FormData()
|
||||
formData.append('file', file)
|
||||
formData.append('key', key)
|
||||
formData.append('bucket', s3Config.bucket)
|
||||
|
||||
// Пока используем простую загрузку через наш API
|
||||
// Позже можно будет сделать прямую загрузку в S3
|
||||
const response = await fetch('/api/upload-avatar', {
|
||||
method: 'POST',
|
||||
body: formData
|
||||
})
|
||||
|
||||
if (!response.ok) {
|
||||
throw new Error('Failed to upload avatar')
|
||||
}
|
||||
|
||||
const result = await response.json()
|
||||
return result.url
|
||||
|
||||
} catch (error) {
|
||||
console.error('Error uploading avatar:', error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
static getAvatarUrl(key: string): string {
|
||||
return `${s3Config.endpoint}/${s3Config.bucket}/${key}`
|
||||
}
|
||||
|
||||
static async deleteAvatar(key: string): Promise<void> {
|
||||
try {
|
||||
await fetch('/api/delete-avatar', {
|
||||
method: 'DELETE',
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ key })
|
||||
})
|
||||
} catch (error) {
|
||||
console.error('Error deleting avatar:', error)
|
||||
throw error
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export default S3Service
|
Reference in New Issue
Block a user