|
@@ -7,7 +7,8 @@ import {
|
|
|
verifyTokenSignature,
|
|
|
} from '../../helpers/auth'
|
|
|
import { hashFile } from '../../helpers/hashing'
|
|
|
-import { createNonce, getTokenExpirationTime } from '../../helpers/tokenNonceKeeper'
|
|
|
+import { registerNewDataObjectId } from '../../caching/newUploads'
|
|
|
+import { createNonce, getTokenExpirationTime } from '../../caching/tokenNonceKeeper'
|
|
|
import { getFileInfo } from '../../helpers/fileInfo'
|
|
|
import { BagId } from '@joystream/types/storage'
|
|
|
import logger from '../../logger'
|
|
@@ -29,6 +30,7 @@ import {
|
|
|
getCommandConfig,
|
|
|
sendResponseWithError,
|
|
|
getHttpStatusCodeByError,
|
|
|
+ AppConfig,
|
|
|
} from './common'
|
|
|
import { getStorageBucketIdsByWorkerId } from '../../sync/storageObligations'
|
|
|
import { Membership } from '@joystream/types/members'
|
|
@@ -37,16 +39,12 @@ const fsPromises = fs.promises
|
|
|
/**
|
|
|
* A public endpoint: serves files by data object ID.
|
|
|
*/
|
|
|
-export async function getFile(req: express.Request, res: express.Response): Promise<void> {
|
|
|
+export async function getFile(req: express.Request, res: express.Response<unknown, AppConfig>): Promise<void> {
|
|
|
try {
|
|
|
const dataObjectId = getDataObjectId(req)
|
|
|
const uploadsDir = getUploadsDir(res)
|
|
|
const fullPath = path.resolve(uploadsDir, dataObjectId)
|
|
|
|
|
|
- if (dataObjectId === '1') {
|
|
|
- throw new Error('Articifial file error')
|
|
|
- }
|
|
|
-
|
|
|
const fileInfo = await getFileInfo(fullPath)
|
|
|
const fileStats = await fsPromises.stat(fullPath)
|
|
|
|
|
@@ -72,7 +70,7 @@ export async function getFile(req: express.Request, res: express.Response): Prom
|
|
|
/**
|
|
|
* A public endpoint: sends file headers by data object ID.
|
|
|
*/
|
|
|
-export async function getFileHeaders(req: express.Request, res: express.Response): Promise<void> {
|
|
|
+export async function getFileHeaders(req: express.Request, res: express.Response<unknown, AppConfig>): Promise<void> {
|
|
|
try {
|
|
|
const dataObjectId = getDataObjectId(req)
|
|
|
const uploadsDir = getUploadsDir(res)
|
|
@@ -93,7 +91,7 @@ export async function getFileHeaders(req: express.Request, res: express.Response
|
|
|
/**
|
|
|
* A public endpoint: receives file.
|
|
|
*/
|
|
|
-export async function uploadFile(req: express.Request, res: express.Response): Promise<void> {
|
|
|
+export async function uploadFile(req: express.Request, res: express.Response<unknown, AppConfig>): Promise<void> {
|
|
|
const uploadRequest: RequestData = req.body
|
|
|
|
|
|
// saved filename to delete on verification or extrinsic errors
|
|
@@ -118,6 +116,8 @@ export async function uploadFile(req: express.Request, res: express.Response): P
|
|
|
const uploadsDir = getUploadsDir(res)
|
|
|
const newPath = path.join(uploadsDir, uploadRequest.dataObjectId.toString())
|
|
|
|
|
|
+ registerNewDataObjectId(uploadRequest.dataObjectId.toString())
|
|
|
+
|
|
|
// Overwrites existing file.
|
|
|
await fsPromises.rename(fileObj.path, newPath)
|
|
|
cleanupFileName = newPath
|
|
@@ -131,6 +131,7 @@ export async function uploadFile(req: express.Request, res: express.Response): P
|
|
|
`Received already accepted data object. DataObjectId = ${uploadRequest.dataObjectId} WorkerId = ${workerId}`
|
|
|
)
|
|
|
}
|
|
|
+
|
|
|
res.status(201).json({
|
|
|
id: hash,
|
|
|
})
|
|
@@ -144,7 +145,10 @@ export async function uploadFile(req: express.Request, res: express.Response): P
|
|
|
/**
|
|
|
* A public endpoint: creates auth token for file uploads.
|
|
|
*/
|
|
|
-export async function authTokenForUploading(req: express.Request, res: express.Response): Promise<void> {
|
|
|
+export async function authTokenForUploading(
|
|
|
+ req: express.Request,
|
|
|
+ res: express.Response<unknown, AppConfig>
|
|
|
+): Promise<void> {
|
|
|
try {
|
|
|
const account = getAccount(res)
|
|
|
const tokenRequest = getTokenRequest(req)
|
|
@@ -194,7 +198,7 @@ function getFileObject(req: express.Request): Express.Multer.File {
|
|
|
* This is a helper function. It parses the response object for a variable and
|
|
|
* throws an error on failure.
|
|
|
*/
|
|
|
-function getAccount(res: express.Response): KeyringPair {
|
|
|
+function getAccount(res: express.Response<unknown, AppConfig>): KeyringPair {
|
|
|
if (res.locals.storageProviderAccount) {
|
|
|
return res.locals.storageProviderAccount
|
|
|
}
|
|
@@ -209,7 +213,7 @@ function getAccount(res: express.Response): KeyringPair {
|
|
|
* This is a helper function. It parses the response object for a variable and
|
|
|
* throws an error on failure.
|
|
|
*/
|
|
|
-function getApi(res: express.Response): ApiPromise {
|
|
|
+function getApi(res: express.Response<unknown, AppConfig>): ApiPromise {
|
|
|
if (res.locals.api) {
|
|
|
return res.locals.api
|
|
|
}
|
|
@@ -331,7 +335,7 @@ async function cleanupFileOnError(cleanupFileName: string, error: string): Promi
|
|
|
/**
|
|
|
* A public endpoint: return the server version.
|
|
|
*/
|
|
|
-export async function getVersion(req: express.Request, res: express.Response): Promise<void> {
|
|
|
+export async function getVersion(req: express.Request, res: express.Response<unknown, AppConfig>): Promise<void> {
|
|
|
try {
|
|
|
const config = getCommandConfig(res)
|
|
|
|