@nestjs/common#ServiceUnavailableException TypeScript Examples
The following examples show how to use
@nestjs/common#ServiceUnavailableException.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: app.service.ts From nestjs-file-streaming with MIT License | 6 votes |
async upload(request: Request): Promise<{ id: string }> {
return new Promise((resolve, reject) => {
try {
request.multipart(
(field, file: Stream, filename, encoding, mimetype) => {
const id = new ObjectId()
const uploadStream = this.bucket.openUploadStreamWithId(
id,
filename,
{
contentType: mimetype,
},
)
file.on('end', () => {
resolve({
id: uploadStream.id.toString(),
})
})
file.pipe(uploadStream)
},
(err) => {
console.error(err)
reject(new ServiceUnavailableException())
},
)
} catch (e) {
console.error(e)
reject(new ServiceUnavailableException())
}
})
}
Example #2
Source File: resources.service.ts From office-hours with GNU General Public License v3.0 | 6 votes |
/**
* Fetch calendar for the given courseId, saving it to disk. Returns the string content
* of the fetched calendar.
*/
public async refetchCalendar(course: CourseModel): Promise<string> {
const spaceLeft = await checkDiskSpace(path.parse(process.cwd()).root);
if (spaceLeft.free < 1000000) {
// less than 1000kb left (calendars range in size from 30-850kb)
throw new ServiceUnavailableException(
ERROR_MESSAGES.resourcesService.noDiskSpace,
);
}
const request = await this.httpService.get(course.icalURL).toPromise();
fs.writeFile(
// not doing this synchronously so the request is faster
path.join(process.env.UPLOAD_LOCATION, this.getCalFilename(course.id)),
request.data,
(err) => {
if (err) {
console.error(ERROR_MESSAGES.resourcesService.saveCalError, err);
} else {
console.log('Saved calendar for course ', course.id);
}
},
);
return request.data;
}
Example #3
Source File: app.service.ts From nestjs-file-streaming with MIT License | 5 votes |
async download(
id: string,
request: Request,
response: Response,
): Promise<StreamableFile> {
try {
if (!ObjectId.isValid(id)) {
throw new BadRequestException(null, 'InvalidVideoId')
}
const oId = new ObjectId(id)
const fileInfo = await this.fileModel.findOne({ _id: id }).exec()
if (!fileInfo) {
throw new NotFoundException(null, 'VideoNotFound')
}
if (request.headers.range) {
const range = request.headers.range.substr(6).split('-')
const start = parseInt(range[0], 10)
const end = parseInt(range[1], 10) || null
const readstream = this.bucket.openDownloadStream(oId, {
start,
end,
})
response.status(206)
response.headers({
'Accept-Ranges': 'bytes',
'Content-Type': fileInfo.contentType,
'Content-Range': `bytes ${start}-${end ? end : fileInfo.length - 1}/${
fileInfo.length
}`,
'Content-Length': (end ? end : fileInfo.length) - start,
'Content-Disposition': `attachment; filename="${fileInfo.filename}"`,
})
return new StreamableFile(readstream)
} else {
const readstream = this.bucket.openDownloadStream(oId)
response.status(200)
response.headers({
'Accept-Range': 'bytes',
'Content-Type': fileInfo.contentType,
'Content-Length': fileInfo.length,
'Content-Disposition': `attachment; filename="${fileInfo.filename}"`,
})
response.send(readstream)
}
} catch (e) {
console.error(e)
throw new ServiceUnavailableException()
}
}
Example #4
Source File: profile.controller.ts From office-hours with GNU General Public License v3.0 | 5 votes |
@Post('/upload_picture')
@UseInterceptors(
FileInterceptor('file', {
storage: memoryStorage(),
}),
)
async uploadImage(
@UploadedFile() file: Express.Multer.File,
@User() user: UserModel,
): Promise<void> {
if (user.photoURL) {
fs.unlink(process.env.UPLOAD_LOCATION + '/' + user.photoURL, (err) => {
console.error(
'Error deleting previous picture at: ',
user.photoURL,
err,
'the previous image was at an invalid location?',
);
});
}
const spaceLeft = await checkDiskSpace(path.parse(process.cwd()).root);
if (spaceLeft.free < 1000000000) {
// if less than a gigabyte left
throw new ServiceUnavailableException(
ERROR_MESSAGES.profileController.noDiskSpace,
);
}
const fileName =
user.id +
'-' +
Math.random().toString(36).substring(2, 15) +
Math.random().toString(36).substring(2, 15);
await sharp(file.buffer)
.resize(256)
.toFile(path.join(process.env.UPLOAD_LOCATION, fileName));
user.photoURL = fileName;
await user.save();
}
Example #5
Source File: paginate.ts From nestjs-paginate with MIT License | 4 votes |
export async function paginate<T>(
query: PaginateQuery,
repo: Repository<T> | SelectQueryBuilder<T>,
config: PaginateConfig<T>
): Promise<Paginated<T>> {
let page = query.page || 1
const limit = Math.min(query.limit || config.defaultLimit || 20, config.maxLimit || 100)
const sortBy = [] as SortBy<T>
const searchBy: Column<T>[] = []
const path = query.path
function isEntityKey(entityColumns: Column<T>[], column: string): column is Column<T> {
return !!entityColumns.find((c) => c === column)
}
if (config.sortableColumns.length < 1) throw new ServiceUnavailableException()
if (query.sortBy) {
for (const order of query.sortBy) {
if (isEntityKey(config.sortableColumns, order[0]) && ['ASC', 'DESC'].includes(order[1])) {
sortBy.push(order as Order<T>)
}
}
}
if (!sortBy.length) {
sortBy.push(...(config.defaultSortBy || [[config.sortableColumns[0], 'ASC']]))
}
if (config.searchableColumns) {
if (query.searchBy) {
for (const column of query.searchBy) {
if (isEntityKey(config.searchableColumns, column)) {
searchBy.push(column)
}
}
} else {
searchBy.push(...config.searchableColumns)
}
}
if (page < 1) page = 1
let [items, totalItems]: [T[], number] = [[], 0]
let queryBuilder: SelectQueryBuilder<T>
if (repo instanceof Repository) {
queryBuilder = repo
.createQueryBuilder('e')
.take(limit)
.skip((page - 1) * limit)
} else {
queryBuilder = repo.take(limit).skip((page - 1) * limit)
}
if (config.relations?.length) {
config.relations.forEach((relation) => {
queryBuilder.leftJoinAndSelect(`${queryBuilder.alias}.${relation}`, `${queryBuilder.alias}_${relation}`)
})
}
for (const order of sortBy) {
if (order[0].split('.').length > 1) {
queryBuilder.addOrderBy(`${queryBuilder.alias}_${order[0]}`, order[1])
} else {
queryBuilder.addOrderBy(`${queryBuilder.alias}.${order[0]}`, order[1])
}
}
if (config.where) {
queryBuilder.andWhere(new Brackets((qb) => qb.andWhere(config.where)))
}
if (config.withDeleted) {
queryBuilder.withDeleted()
}
if (query.search && searchBy.length) {
queryBuilder.andWhere(
new Brackets((qb: SelectQueryBuilder<T>) => {
for (const column of searchBy) {
const propertyPath = (column as string).split('.')
if (propertyPath.length > 1) {
const condition: WherePredicateOperator = {
operator: 'ilike',
parameters: [`${qb.alias}_${column}`, `:${column}`],
}
qb.orWhere(qb['createWhereConditionExpression'](condition), {
[column]: `%${query.search}%`,
})
} else {
qb.orWhere({
[column]: ILike(`%${query.search}%`),
})
}
}
})
)
}
if (query.filter) {
const filter = parseFilter(query, config)
queryBuilder.andWhere(
new Brackets((qb: SelectQueryBuilder<T>) => {
for (const column in filter) {
const propertyPath = (column as string).split('.')
if (propertyPath.length > 1) {
const condition = qb['getWherePredicateCondition'](
column,
filter[column]
) as WherePredicateOperator
let parameters = { [column]: filter[column].value }
// TODO: refactor below
switch (condition.operator) {
case 'between':
condition.parameters = [`${qb.alias}_${column}`, `:${column}_from`, `:${column}_to`]
parameters = {
[column + '_from']: filter[column].value[0],
[column + '_to']: filter[column].value[1],
}
break
case 'in':
condition.parameters = [`${qb.alias}_${column}`, `:...${column}`]
break
default:
condition.parameters = [`${qb.alias}_${column}`, `:${column}`]
break
}
qb.andWhere(qb['createWhereConditionExpression'](condition), parameters)
} else {
qb.andWhere({
[column]: filter[column],
})
}
}
})
)
}
;[items, totalItems] = await queryBuilder.getManyAndCount()
let totalPages = totalItems / limit
if (totalItems % limit) totalPages = Math.ceil(totalPages)
const sortByQuery = sortBy.map((order) => `&sortBy=${order.join(':')}`).join('')
const searchQuery = query.search ? `&search=${query.search}` : ''
const searchByQuery =
query.searchBy && searchBy.length ? searchBy.map((column) => `&searchBy=${column}`).join('') : ''
const filterQuery = query.filter
? '&' +
stringify(
mapKeys(query.filter, (_param, name) => 'filter.' + name),
'&',
'=',
{ encodeURIComponent: (str) => str }
)
: ''
const options = `&limit=${limit}${sortByQuery}${searchQuery}${searchByQuery}${filterQuery}`
const buildLink = (p: number): string => path + '?page=' + p + options
const results: Paginated<T> = {
data: items,
meta: {
itemsPerPage: limit,
totalItems,
currentPage: page,
totalPages: totalPages,
sortBy,
search: query.search,
searchBy: query.search ? searchBy : undefined,
filter: query.filter,
},
links: {
first: page == 1 ? undefined : buildLink(1),
previous: page - 1 < 1 ? undefined : buildLink(page - 1),
current: buildLink(page),
next: page + 1 > totalPages ? undefined : buildLink(page + 1),
last: page == totalPages || !totalItems ? undefined : buildLink(totalPages),
},
}
return Object.assign(new Paginated<T>(), results)
}