Skip to content

Commit

Permalink
global search apis for cms, jsk
Browse files Browse the repository at this point in the history
  • Loading branch information
saigonbitmaster committed Apr 15, 2023
1 parent f798ee6 commit 04f8344
Show file tree
Hide file tree
Showing 7 changed files with 456 additions and 19 deletions.
4 changes: 4 additions & 0 deletions api/src/customapi/module.ts
Expand Up @@ -4,13 +4,16 @@ import { SearchService } from './search.service';
import { SearchController } from './search.controller';
import { PublicController } from './public.controller';
import { MongooseModule } from '@nestjs/mongoose';
import { SkillModule } from '../skill/module';

import {
TokenReceiver,
TokenReceiverSchema,
} from './schemas/token-receiver.schema';
import { Campaign, CampaignSchema } from './schemas/campaign.schema';
import { PostJobModule } from '../postjob/module';
import { JobBidModule } from '../jobbid/module';

//apis for homepage & other public requests
@Module({
providers: [PublicService, SearchService],
Expand All @@ -22,6 +25,7 @@ import { JobBidModule } from '../jobbid/module';
]),
JobBidModule,
PostJobModule,
SkillModule,
],
exports: [PublicService, SearchService],
})
Expand Down
23 changes: 18 additions & 5 deletions api/src/customapi/search.controller.ts
Expand Up @@ -8,18 +8,31 @@ import {
Put,
Response,
Query,
Request,
} from '@nestjs/common';
import { SearchService } from './search.service';
import { queryTransform, formatRaList } from '../flatworks/utils/getlist';
import { queryTransform } from '../flatworks/utils/getlist';

@Controller('customapis')
export class SearchController {
constructor(private readonly service: SearchService) {}

@Get('searchall')
async indexTokenReceiver(@Response() res: any, @Query() query) {
@Get('searchemp')
async indexEmp(@Response() res: any, @Query() query) {
const mongooseQuery = queryTransform(query);
const result = await this.service.findAll(mongooseQuery);
return formatRaList(res, result);
const result: any = await this.service.findAllEmp(mongooseQuery.filter);
return res.json(result);
}

async indexJsk(@Response() res: any, @Query() query) {
const mongooseQuery = queryTransform(query);
const result: any = await this.service.findAllJsk(mongooseQuery.filter);
return res.json(result);
}

async indexCms(@Response() res: any, @Query() query) {
const mongooseQuery = queryTransform(query);
const result: any = await this.service.findAllCms(mongooseQuery.filter);
return res.json(result);
}
}
274 changes: 260 additions & 14 deletions api/src/customapi/search.service.ts
@@ -1,3 +1,4 @@
import { SkillService } from '../skill/service';
import { PostJobService } from '../postjob/service';
import { JobBidService } from '../jobbid/service';
import { Injectable, HttpException, HttpStatus } from '@nestjs/common';
Expand All @@ -7,11 +8,12 @@ export class SearchService {
constructor(
private readonly postJobService: PostJobService,
private readonly jobBidService: JobBidService,
private readonly skillService: SkillService,
) {}

async findAll(filter): Promise<any> {
async findAllEmp(filter): Promise<any> {
const config = {
baseUrl: 'http://localhost:3001/#',
baseUrl: 'http://localhost:3002/#',
priority: [
{
priority: 1,
Expand All @@ -29,17 +31,28 @@ export class SearchService {
limit: 0,
skip: 0,
},
{
priority: 3,
collection: 'skills',
serviceName: 'skillService',
totalRecords: 0,
limit: 0,
skip: 0,
},
],
};

const text = filter.text;
let _limit = filter.limit;
let _skip = filter.skip;

const _searchCols = await Promise.all(
config.priority.map(async (item, index) => {
const _ = await this[item.serviceName].findAll({
$text: {
$search: text,
filter: {
$text: {
$search: text,
},
},
});
const totalRecords = _.count;
Expand All @@ -59,7 +72,7 @@ export class SearchService {
(_skip = _skip - item.totalRecords))
: ((item.skip = _skip),
(item.limit = item.totalRecords - _skip),
(_limit = _limit - item.totalRecords - _skip),
(_limit = _limit - (item.totalRecords - _skip)),
(_skip = 0));

return item;
Expand All @@ -68,20 +81,253 @@ export class SearchService {
const results = await Promise.all(
searchCols.map(async (item, index) => {
let result;
const query = {
filter: {
$text: {
$search: text,
},
},
sort: {},
skip: item.skip,
limit: item.limit,
};

try {
result = await this[item.serviceName].findAll(
{
$text: {
$search: text,
},
result = await this[item.serviceName].findAll(query);
} catch (error) {
console.log(error);
}

return {
count: result.count,
data: result.data.map((record) => ({
...record._doc,
collectionName: item.collection,
})),
};
}),
);
let data = [];
let count = 0;

results.forEach((item) => {
const _data = item.data.map((item) => ({
text: item.name || item.username || item.title,
link: `${config.baseUrl}/${item.collectionName}/${item._id}/show`,
_id: item._id,
}));
data = [...data, ..._data];
count = (count + item.count) as number;
});

return {
data,
count,
};
}

async findAllJsk(filter): Promise<any> {
const config = {
baseUrl: 'http://localhost:3003/#',
priority: [
{
priority: 1,
collection: 'postjobs',
serviceName: 'postJobService',
totalRecords: 0,
limit: 0,
skip: 0,
},
{
priority: 2,
collection: 'jobbids',
serviceName: 'jobBidService',
totalRecords: 0,
limit: 0,
skip: 0,
},
{
priority: 3,
collection: 'skills',
serviceName: 'skillService',
totalRecords: 0,
limit: 0,
skip: 0,
},
],
};

const text = filter.text;
let _limit = filter.limit;
let _skip = filter.skip;

const _searchCols = await Promise.all(
config.priority.map(async (item, index) => {
const _ = await this[item.serviceName].findAll({
filter: {
$text: {
$search: text,
},
},
});
const totalRecords = _.count;
return { ...item, totalRecords: totalRecords };
}),
);

const searchCols = _searchCols.map((item, index) => {
_limit == 0
? null
: item.totalRecords - _skip > _limit
? ((item.limit = _limit), (_limit = 0), (item.skip = _skip))
: item.totalRecords < _skip
? ((item.skip = item.totalRecords),
(item.limit = 0),
(_limit = _limit),
(_skip = _skip - item.totalRecords))
: ((item.skip = _skip),
(item.limit = item.totalRecords - _skip),
(_limit = _limit - (item.totalRecords - _skip)),
(_skip = 0));

return item;
});

const results = await Promise.all(
searchCols.map(async (item, index) => {
let result;
const query = {
filter: {
$text: {
$search: text,
},
{},
item.skip,
item.limit,
);
},
sort: {},
skip: item.skip,
limit: item.limit,
};

try {
result = await this[item.serviceName].findAll(query);
} catch (error) {
console.log(error);
}

return {
count: result.count,
data: result.data.map((record) => ({
...record._doc,
collectionName: item.collection,
})),
};
}),
);
let data = [];
let count = 0;

results.forEach((item) => {
const _data = item.data.map((item) => ({
text: item.name || item.username || item.title,
link: `${config.baseUrl}/${item.collectionName}/${item._id}/show`,
_id: item._id,
}));
data = [...data, ..._data];
count = (count + item.count) as number;
});

return {
data,
count,
};
}

async findAllCms(filter): Promise<any> {
const config = {
baseUrl: 'http://localhost:3001/#',
priority: [
{
priority: 1,
collection: 'postjobs',
serviceName: 'postJobService',
totalRecords: 0,
limit: 0,
skip: 0,
},
{
priority: 2,
collection: 'jobbids',
serviceName: 'jobBidService',
totalRecords: 0,
limit: 0,
skip: 0,
},
{
priority: 3,
collection: 'skills',
serviceName: 'skillService',
totalRecords: 0,
limit: 0,
skip: 0,
},
],
};

const text = filter.text;
let _limit = filter.limit;
let _skip = filter.skip;

const _searchCols = await Promise.all(
config.priority.map(async (item, index) => {
const _ = await this[item.serviceName].findAll({
filter: {
$text: {
$search: text,
},
},
});
const totalRecords = _.count;
return { ...item, totalRecords: totalRecords };
}),
);

const searchCols = _searchCols.map((item, index) => {
_limit == 0
? null
: item.totalRecords - _skip > _limit
? ((item.limit = _limit), (_limit = 0), (item.skip = _skip))
: item.totalRecords < _skip
? ((item.skip = item.totalRecords),
(item.limit = 0),
(_limit = _limit),
(_skip = _skip - item.totalRecords))
: ((item.skip = _skip),
(item.limit = item.totalRecords - _skip),
(_limit = _limit - (item.totalRecords - _skip)),
(_skip = 0));

return item;
});

const results = await Promise.all(
searchCols.map(async (item, index) => {
let result;
const query = {
filter: {
$text: {
$search: text,
},
},
sort: {},
skip: item.skip,
limit: item.limit,
};

try {
result = await this[item.serviceName].findAll(query);
} catch (error) {
console.log(error);
}

return {
count: result.count,
data: result.data.map((record) => ({
Expand Down
7 changes: 7 additions & 0 deletions api/src/jobbid/service.ts
Expand Up @@ -20,6 +20,13 @@ export class JobBidService {

async findAll(query: MongooseQuery): Promise<RaList> {
const count = await this.model.find(query.filter).count().exec();
//fix return all when limit = 0
if (query.limit <= 0) {
return {
data: [],
count: count,
};
}
const data = await this.model
.find(query.filter)
.sort(query.sort)
Expand Down

0 comments on commit 04f8344

Please sign in to comment.