Skip to content

Commit e351063

Browse files
Merge pull request #46 from StreetSupport/feature/3017-create-location-specific-content-management-system
3017 - Update uploading files/images
2 parents 9d660e3 + 91c5bd0 commit e351063

File tree

6 files changed

+25
-32
lines changed

6 files changed

+25
-32
lines changed

package-lock.json

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/controllers/bannerController.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ export const updateBanner = asyncHandler(async (req: Request, res: Response) =>
187187
// Handle template type change from RESOURCE_PROJECT to another type
188188
if (oldBannerData.TemplateType === BannerTemplateType.RESOURCE_PROJECT &&
189189
validation?.data?.TemplateType !== BannerTemplateType.RESOURCE_PROJECT) {
190-
await handleResourceProjectTemplateChange(oldBannerData, validation.data);
190+
await handleResourceProjectTemplateChange(oldBannerData);
191191
}
192192

193193
// Handle resource project specific logic
@@ -359,7 +359,7 @@ function _handleResourceProjectBannerLogic(bannerData: any): any {
359359

360360
// Private helper to handle template type change from RESOURCE_PROJECT
361361
// Cleans up resource file and CTA button with blob URL when template type changes
362-
async function handleResourceProjectTemplateChange(oldBannerData: any, newBannerData: any): Promise<void> {
362+
async function handleResourceProjectTemplateChange(oldBannerData: any): Promise<void> {
363363
// Check if old banner had a resource file with a blob URL
364364
if (oldBannerData.ResourceProject?.ResourceFile?.FileUrl) {
365365
const fileUrl = oldBannerData.ResourceProject.ResourceFile.FileUrl;

src/controllers/locationLogoController.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ export const updateLocationLogo = asyncHandler(async (req: Request, res: Respons
130130

131131
// Extract uploaded file URL from req
132132
let logoPath = existingLogo.LogoPath;
133+
133134
if (req.body.LogoPath && req.body.LogoPath !== existingLogo.LogoPath) {
134135
logoPath = req.body.LogoPath;
135136
}

src/middleware/uploadMiddleware.ts

Lines changed: 13 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -37,14 +37,18 @@ const storage = multer.memoryStorage();
3737
const upload = multer({
3838
storage,
3939
limits: {
40-
fileSize: 5 * 1024 * 1024, // 10MB limit
40+
fileSize: 10 * 1024 * 1024, // 10MB limit
4141
files: 10 // Maximum 10 files
4242
},
4343
fileFilter: (req, file, cb) => {
44-
// Combine banner image types with resource file types
45-
const bannerImageTypes = ['image/jpeg', 'image/jpg', 'image/png', 'image/webp', 'image/svg+xml'];
44+
const imageTypes = [
45+
'image/jpeg', 'image/jpg', 'image/png', 'image/webp', 'image/svg+xml',
46+
'image/x-xbitmap', 'image/tiff', 'image/jpeg', 'image/vnd.mozilla-apng',
47+
'image/svg+xml-compressed', 'image/x-icon', 'image/heif', 'image/heic',
48+
'image/avif', 'image/bmp', 'image/pjpeg'
49+
];
4650
const resourceFileTypes = Object.keys(SUPPORTED_RESOURCE_FILE_TYPES);
47-
const allowedMimeTypes = [...new Set([...bannerImageTypes, ...resourceFileTypes])];
51+
const allowedMimeTypes = [...new Set([...imageTypes, ...resourceFileTypes])];
4852

4953
if (allowedMimeTypes.includes(file.mimetype)) {
5054
cb(null, true);
@@ -88,24 +92,7 @@ async function uploadToAzure(file: Express.Multer.File, containerName: string):
8892
return blockBlobClient.url;
8993
}
9094

91-
// Fallback: Save to local uploads directory
92-
function saveToLocal(file: Express.Multer.File, containerName: string): string {
93-
const uploadsDir = path.join(process.cwd(), 'public', 'uploads', containerName);
94-
const fileExtension = path.extname(file.originalname);
95-
const fileName = `${uuidv4()}${fileExtension}`;
96-
const filePath = path.join(uploadsDir, fileName);
97-
98-
// Create directory if it doesn't exist
99-
if (!fs.existsSync(uploadsDir)) {
100-
fs.mkdirSync(uploadsDir, { recursive: true });
101-
}
102-
103-
// Write file
104-
fs.writeFileSync(filePath, file.buffer);
105-
106-
// Return relative URL
107-
return `/public/uploads/${containerName}/${fileName}`;
108-
}
95+
// saveToLocal() function removed - Azure Blob Storage is required
10996

11097
// Process uploaded files and add URLs to request body
11198
async function processUploads(req: Request, res: Response, next: NextFunction) {
@@ -139,7 +126,7 @@ async function processUploads(req: Request, res: Response, next: NextFunction) {
139126
if (blobServiceClient) {
140127
fileUrl = await uploadToAzure(file, BANNERS_CONTAINER_NAME);
141128
} else {
142-
fileUrl = saveToLocal(file, BANNERS_CONTAINER_NAME);
129+
throw new Error('Azure Blob Storage is required for file uploads.');
143130
}
144131

145132
// Create asset object
@@ -257,7 +244,7 @@ export const uploadSwepImage = async (req: Request, res: Response, next: NextFun
257244
if (blobServiceClient) {
258245
fileUrl = await uploadToAzure(file, SWEPS_CONTAINER_NAME);
259246
} else {
260-
fileUrl = saveToLocal(file, SWEPS_CONTAINER_NAME);
247+
throw new Error('Azure Blob Storage is required for file uploads.');
261248
}
262249

263250
// Attach uploaded file info to request body
@@ -302,7 +289,7 @@ export const uploadResourceFiles = async (req: Request, res: Response, next: Nex
302289
if (blobServiceClient) {
303290
fileUrl = await uploadToAzure(file, RESOURCES_CONTAINER_NAME);
304291
} else {
305-
fileUrl = saveToLocal(file, RESOURCES_CONTAINER_NAME);
292+
throw new Error('Azure Blob Storage is required for file uploads.');
306293
}
307294

308295
// Attach uploaded file URL to request body using the field name
@@ -340,7 +327,7 @@ export const uploadLocationLogo = async (req: Request, res: Response, next: Next
340327
if (blobServiceClient) {
341328
fileUrl = await uploadToAzure(file, LOCATION_LOGOS_CONTAINER_NAME);
342329
} else {
343-
fileUrl = saveToLocal(file, LOCATION_LOGOS_CONTAINER_NAME);
330+
throw new Error('Azure Blob Storage is required for file uploads.');
344331
}
345332

346333
// Attach uploaded file path to request body

src/schemas/locationLogoSchema.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ export const LocationLogoSchemaCore = z.object({
1313
DisplayName: z.string().min(1, 'Display name is required'),
1414
LocationSlug: z.string().min(1, 'Location slug is required'),
1515
LocationName: z.string().min(1, 'Location name is required'),
16-
LogoPath: z.string().min(1, 'Logo path is required'),
16+
LogoPath: z.string().min(1, 'Logo is required'),
1717
Url: z.string().url('Must be a valid URL').min(1, 'URL is required'),
1818
});
1919

src/types/banners/IResourceFile.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ export const SUPPORTED_RESOURCE_FILE_TYPES = {
3535

3636
// Archives
3737
'application/zip': { extension: 'ZIP', description: 'ZIP Archive' },
38+
39+
// Images
40+
'image/jpeg': { extension: 'JPG', description: 'JPEG Image' },
41+
'image/jpg': { extension: 'JPG', description: 'JPEG Image' },
42+
'image/png': { extension: 'PNG', description: 'PNG Image' },
3843
} as const;
3944

4045
export const RESOURCE_FILE_ACCEPT_STRING = Object.keys(SUPPORTED_RESOURCE_FILE_TYPES).join(',');

0 commit comments

Comments
 (0)