Skip to content

Commit

Permalink
fix(mis): 修复租户、账户已结束作业列表,可搜索出非本租户、账户下的作业的问题 (#533)
Browse files Browse the repository at this point in the history
  • Loading branch information
tongchong committed Apr 3, 2023
1 parent fc1730d commit ece2b01
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 21 deletions.
6 changes: 6 additions & 0 deletions .changeset/tender-queens-smash.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@scow/mis-server": patch
"@scow/mis-web": patch
---

修复管理端的作业操作权限问题
21 changes: 10 additions & 11 deletions apps/mis-server/src/services/job.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import { ensureNotUndefined, plugin } from "@ddadaal/tsgrpc-server";
import { ServiceError, status } from "@grpc/grpc-js";
import { Status } from "@grpc/grpc-js/build/src/constants";
import { FilterQuery, QueryOrder, UniqueConstraintViolationException } from "@mikro-orm/core";
import { MySqlDriver, SqlEntityManager } from "@mikro-orm/mysql";
import { Decimal, decimalToMoney, moneyToNumber } from "@scow/lib-decimal";
import {
GetJobsResponse,
Expand Down Expand Up @@ -62,14 +61,10 @@ function toGrpc(x: JobInfoEntity) {
};
}

async function filterJobs({
function filterJobs({
clusters, accountName, jobEndTimeEnd, tenantName,
jobEndTimeStart, jobId, userId, startBiJobIndex,
}: JobFilter, em: SqlEntityManager<MySqlDriver>) {

const accountNames = (accountName === undefined && userId === undefined)
? (await em.find(Account, { tenant: { name: tenantName } }, { fields: ["accountName"]})).map((x) => x.accountName)
: accountName;
}: JobFilter) {

return {
...startBiJobIndex ? { biJobIndex: { $gte: startBiJobIndex } } : {},
Expand All @@ -78,27 +73,31 @@ async function filterJobs({
...jobId
? {
idJob: jobId,
...accountName === undefined ? {} : { account: accountName },
} : {
...accountNames === undefined ? {} : { account: accountNames },
...accountName === undefined ? {} : { account: accountName },
...(jobEndTimeEnd || jobEndTimeStart) ? {
timeEnd: {
...jobEndTimeStart ? { $gte: jobEndTimeStart } : {},
...jobEndTimeEnd ? { $lte: jobEndTimeEnd } : {},
},
} : {},
},
tenant: tenantName,
} as FilterQuery<JobInfoEntity>;
}

export const jobServiceServer = plugin((server) => {

server.addService<JobServiceServer>(JobServiceService, {

getJobs: async ({ request, em }) => {
getJobs: async ({ request, em, logger }) => {

const { filter, page, pageSize } = ensureNotUndefined(request, ["filter"]);

const sqlFilter = await filterJobs(filter, em);
const sqlFilter = filterJobs(filter);

logger.info("getJobs sqlFilter %s", JSON.stringify(sqlFilter));

const [jobs, count] = await em.findAndCount(JobInfoEntity, sqlFilter, {
...paginationProps(page, pageSize || 10),
Expand Down Expand Up @@ -131,7 +130,7 @@ export const jobServiceServer = plugin((server) => {

return await em.transactional(async (em) => {

const jobs = await em.find(JobInfoEntity, await filterJobs(filter, em), {});
const jobs = await em.find(JobInfoEntity, filterJobs(filter), {});

const record = new JobPriceChange({
jobs,
Expand Down
29 changes: 27 additions & 2 deletions apps/mis-server/tests/job/JobService.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import { Server } from "@ddadaal/tsgrpc-server";
import { ChannelCredentials } from "@grpc/grpc-js";
import { SqlEntityManager } from "@mikro-orm/mysql";
import { Decimal, moneyToNumber, numberToMoney } from "@scow/lib-decimal";
import { JobServiceClient } from "@scow/protos/build/server/job";
import { JobFilter, JobServiceClient } from "@scow/protos/build/server/job";
import { createServer } from "src/app";
import { JobInfo } from "src/entities/JobInfo";
import { JobPriceChange } from "src/entities/JobPriceChange";
Expand Down Expand Up @@ -189,6 +189,31 @@ it("returns jobs starting from start_bi_job_index", async () => {
});

expect(reply.jobs).toSatisfyAll((x: JobInfo) => x.biJobIndex >= 10);
expect(reply.jobs).toHaveLength(30);
expect(reply.jobs).toHaveLength(50);

});

it("returns 0 job if Accout not exist or is not in scope of permissions", async () => {
const em = server.ext.orm.em.fork();

await em.persistAndFlush(range(1, 20).map((x) =>
mockOriginalJobData(x, data.uaAA, new Decimal(20), new Decimal(10))));

const test = async (filter: JobFilter) => {
const client = createClient();
const reply = await asyncClientCall(client, "getJobs", {
filter,
page: 1,
pageSize: 10,
});
expect(reply.jobs).toHaveLength(0);
};

await Promise.all([
// 当用户id与账号无关时,查不到数据
test({ tenantName: "default2", clusters: []}),
// 当用户id与账号无关时,查不到数据
test({ tenantName: data.tenant.name, userId: "a", accountName: "hpcb", clusters: []}),
]);

});
18 changes: 11 additions & 7 deletions apps/mis-web/src/pageComponents/job/HistoryJobTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,8 @@ export const JobTable: React.FC<Props> = ({

const rangeSearch = useRef(true);

const [pageInfo, setPageInfo] = useState({ page: 1, pageSize: 10 });

const [query, setQuery] = useState<FilterForm>(() => {
const now = dayjs();
return {
Expand All @@ -68,24 +70,26 @@ export const JobTable: React.FC<Props> = ({
});

useDidUpdateEffect(() => {
setPageInfo({ page: 1, pageSize: pageInfo.pageSize });
setQuery((q) => ({
...q,
accountName: Array.isArray(accountNames) ? accountNames[0] : accountNames,
}));

}, [accountNames]);

const [form] = Form.useForm<FilterForm>();

const [pageInfo, setPageInfo] = useState({ page: 1, pageSize: 10 });

const promiseFn = useCallback(async () => {
return await api.getJobInfo({ query: {
userId: rangeSearch.current ? (query.userId || userId || undefined) : undefined,
// userId: rangeSearch.current ? (query.userId || userId || undefined) : undefined,
userId: query.userId || userId || undefined,
jobId: rangeSearch.current ? undefined : query.jobId,
page: pageInfo.page,
pageSize: pageInfo.pageSize,
clusters: query.clusters?.map((x) => x.id),
accountName: query.accountName || undefined,
accountName: query.accountName || (Array.isArray(accountNames) ? undefined : accountNames),
jobEndTimeStart: query.jobEndTime[0].toISOString(),
jobEndTimeEnd: query.jobEndTime[1].toISOString(),
} }).catch((e: HttpError) => {
Expand All @@ -107,10 +111,9 @@ export const JobTable: React.FC<Props> = ({
form={form}
initialValues={query}
onFinish={async () => {
setQuery({
accountName: query.accountName,
...(await form.validateFields()),
});
const currentQuery = await form.validateFields();
setQuery(currentQuery);
setPageInfo({ page: 1, pageSize: pageInfo.pageSize });
}}
>
<FilterFormTabs
Expand Down Expand Up @@ -250,6 +253,7 @@ export const JobInfoTable: React.FC<JobInfoTableProps> = ({
}
</TableTitle>
<Table
rowKey={(i) => i.idJob}
dataSource={data?.jobs}
loading={isLoading}
pagination={setPageInfo ? {
Expand Down
5 changes: 4 additions & 1 deletion apps/mis-web/src/pageComponents/tenant/AdminJobTable.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,9 @@ export const AdminJobTable: React.FC<Props> = () => {
form={form}
initialValues={query}
onFinish={async () => {
setQuery(await form.validateFields());
const currentQuery = await form.validateFields();
setQuery(currentQuery);
setPageInfo({ page: 1, pageSize: pageInfo.pageSize });
}}
>
<FilterFormTabs
Expand Down Expand Up @@ -231,6 +233,7 @@ const JobInfoTable: React.FC<JobInfoTableProps> = ({
</Space>
</TableTitle>
<Table
rowKey={(i) => i.idJob}
dataSource={data?.jobs}
loading={isLoading}
pagination={setPageInfo ? {
Expand Down

0 comments on commit ece2b01

Please sign in to comment.