Skip to content

Commit 9b30370

Browse files
committed
Add metadata upload
1 parent 379bde4 commit 9b30370

File tree

4 files changed

+73
-8
lines changed

4 files changed

+73
-8
lines changed

src/app.controller.ts

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,10 +20,11 @@ import {GetTradesDto} from "./dto/trade.dto";
2020
import {AddUserDto, GetUsersDto} from "./dto/user.dto";
2121
import {UserService} from "./user/user.service";
2222
import {FileInterceptor} from "@nestjs/platform-express";
23-
import { Storage } from '@google-cloud/storage'
2423
import * as path from "node:path";
2524
import {GcloudService} from "./gcloud/gcloud.service";
2625
const serviceKey = path.join(__dirname, './keys.json')
26+
import { v4 as uuidv4 } from 'uuid';
27+
import {AddTokenMetadataDto} from "./dto/metadata.dto";
2728

2829
@SkipThrottle()
2930
@ApiTags('app')
@@ -97,10 +98,35 @@ export class AppController {
9798

9899
@Post('/uploadImage')
99100
@UseInterceptors(FileInterceptor('file'))
100-
async uploadFile(@UploadedFile() uploadedFile: Express.Multer.File, @Headers() headers) {
101+
async uploadImage(@UploadedFile() uploadedFile: Express.Multer.File, @Headers() headers) {
101102
const userAddress = headers['meta_user_address']
102-
const publicImageUrl = await this.gCloudService.uploadImage(userAddress, uploadedFile)
103-
this.logger.log(`Image uploaded, publicUrl=${publicImageUrl}, userAddress=${userAddress}`)
104-
return publicImageUrl
103+
const uuid = uuidv4()
104+
const imageUrl = await this.gCloudService.uploadImage(uploadedFile, uuid)
105+
this.logger.log(`Image uploaded, imageUrl=${imageUrl}, userAddress=${userAddress}`)
106+
return imageUrl
107+
}
108+
109+
@Post('/metadata')
110+
async addMetadata(@Body() dto: AddTokenMetadataDto) {
111+
let uuid = ''
112+
113+
if(!dto.image) {
114+
throw new BadRequestException('Image property is missing')
115+
}
116+
117+
const imageItems = dto.image.split('/')
118+
if(imageItems.length > 0) {
119+
uuid = imageItems[imageItems.length - 1].split('.')[0]
120+
} else {
121+
throw new BadRequestException('Invalid image url')
122+
}
123+
124+
if(!uuid) {
125+
throw new BadRequestException('Failed to get uuid')
126+
}
127+
128+
const metadataUrl = await this.gCloudService.uploadMetadata(dto, uuid)
129+
this.logger.log(`Metadata uploaded, url=${metadataUrl}, content: ${JSON.stringify(dto)}`)
130+
return metadataUrl
105131
}
106132
}

src/app.service.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ export class AppService {
5252
this.tokenFactoryContract = new this.web3.eth.Contract(TokenFactoryABI, contractAddress);
5353
this.bootstrap().then(
5454
() => {
55-
// this.eventsTrackingLoop()
55+
this.eventsTrackingLoop()
5656
}
5757
)
5858
this.logger.log(`App service started`)

src/dto/metadata.dto.ts

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import {IsString} from 'class-validator';
3+
import {Transform, Type} from "class-transformer";
4+
5+
export class AddTokenMetadataDto {
6+
@ApiProperty({ type: String, required: true })
7+
@Type(() => String)
8+
@IsString()
9+
userAddress: string;
10+
11+
@ApiProperty({ type: String, required: true })
12+
@Type(() => String)
13+
@IsString()
14+
name: string;
15+
16+
@ApiProperty({ type: String, required: true })
17+
@Type(() => String)
18+
@IsString()
19+
ticker: string;
20+
21+
@ApiProperty({ type: String, required: true })
22+
@Type(() => String)
23+
@IsString()
24+
description: string;
25+
26+
@ApiProperty({ type: String, required: true })
27+
@Type(() => String)
28+
@IsString()
29+
image: string;
30+
}

src/gcloud/gcloud.service.ts

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import {Injectable, Logger} from '@nestjs/common';
22
import {ConfigService} from "@nestjs/config";
33
import {Storage} from "@google-cloud/storage";
4+
import {AddTokenMetadataDto} from "../dto/metadata.dto";
45

56
@Injectable()
67
export class GcloudService {
@@ -15,11 +16,19 @@ export class GcloudService {
1516
})
1617
}
1718

18-
public async uploadImage(userAddress: string, uploadedFile: Express.Multer.File) {
19+
public async uploadImage(uploadedFile: Express.Multer.File, filename: string) {
1920
const bucket = this.storage.bucket('pump-fun-metadata')
20-
const storageFileUrl = `images/${userAddress}/test.jpg`
21+
const storageFileUrl = `images/${filename}.jpg`
2122
const file = bucket.file(storageFileUrl)
2223
await file.save(uploadedFile.buffer)
2324
return `https://storage.googleapis.com/pump-fun-metadata/${storageFileUrl}`
2425
}
26+
27+
public async uploadMetadata(dto: AddTokenMetadataDto, filename: string) {
28+
const bucket = this.storage.bucket('pump-fun-metadata')
29+
const storageFileUrl = `metadata/${filename}.json`
30+
const file = bucket.file(storageFileUrl)
31+
await file.save(JSON.stringify(dto))
32+
return `https://storage.googleapis.com/pump-fun-metadata/${storageFileUrl}`
33+
}
2534
}

0 commit comments

Comments
 (0)