🐛 Do not display deleted items in the shared with me section (#394)

This commit is contained in:
Anton Shepilov
2024-02-29 15:58:20 +01:00
committed by GitHub
parent 23d113c306
commit ac30657aea
4 changed files with 72 additions and 7 deletions
@@ -678,6 +678,7 @@ export class DocumentsService {
* restore a Drive Document and its children
*
* @param {string} id - the item id
* @param item item to restore
* @param {DriveExecutionContext} context - the execution context
* @returns {Promise<void>}
*/
@@ -981,7 +982,7 @@ export class DocumentsService {
]
: []),
],
$nin: [...(options.onlyDirectlyShared ? [["creator", [context.user.id]] as inType] : [])],
$nin: [...(options.onlyUploadedNotByMe ? [["creator", [context.user.id]] as inType] : [])],
$lte: [
...(options.last_modified_lt
? [["last_modified", options.last_modified_lt] as comparisonType]
@@ -1011,7 +1012,10 @@ export class DocumentsService {
const filteredResult = await this.filter(result.getEntities(), async item => {
try {
//skip all the fiels
return await checkAccess(item.id, null, "read", this.repository, context);
return (
!item.is_in_trash &&
(await checkAccess(item.id, null, "read", this.repository, context))
);
} catch (error) {
this.logger.warn("failed to check item access", error);
return false;
@@ -1023,7 +1027,7 @@ export class DocumentsService {
if (options.onlyUploadedNotByMe) {
const filteredResult = await this.filter(result.getEntities(), async item => {
return item.creator != context.user.id;
return item.creator != context.user.id && !item.is_in_trash;
});
return new ListResult(result.type, filteredResult, result.nextPage);
@@ -287,7 +287,7 @@ export default class UserApi {
async browseDocuments(
id: string,
payload: Record<string, any>
payload: Record<string, any> = {}
) {
const response = await this.platform.app.inject({
method: "POST",
@@ -150,7 +150,7 @@ describe("The Documents Browser Window and API", () => {
expect((await anotherUser.browseDocuments("shared_with_me", {pagination: {limitStr: 100}})).children).toHaveLength(1);
});
it("User should be able to delete file that was shared with him with right permissions", async () => {
it("User should be able to delete file that was shared with him with 'manage' permissions", async () => {
const oneUser = await UserApi.getInstance(platform, true, {companyRole: "admin"});
const anotherUser = await UserApi.getInstance(platform, true, {companyRole: "admin"});
@@ -170,6 +170,58 @@ describe("The Documents Browser Window and API", () => {
expect(response.statusCode).toBe(200);
});
it("User should be able to delete folder with the files that was shared with him with 'manage' permissions", async () => {
const oneUser = await UserApi.getInstance(platform, true);
const anotherUser = await UserApi.getInstance(platform, true);
const dir = await oneUser.createDirectory("user_" + oneUser.user.id);
const level2Dir = await oneUser.createDirectory(dir.id);
const level2Dir2 = await oneUser.createDirectory(dir.id);
await oneUser.uploadAllFilesOneByOne(level2Dir.id);
await oneUser.uploadAllFilesOneByOne(level2Dir2.id);
await oneUser.uploadAllFilesOneByOne(dir.id);
await new Promise(r => setTimeout(r, 5000));
dir.access_info.entities.push({
type: "user",
id: anotherUser.user.id,
level: "manage",
grantor: null,
});
await oneUser.updateDocument(dir.id, dir);
const response = await anotherUser.delete(dir.id);
expect(response.statusCode).toBe(200);
});
it("Shouldn't return files that are in trash", async () => {
const oneUser = await UserApi.getInstance(platform, true);
const anotherUser = await UserApi.getInstance(platform, true);
const dir = await oneUser.createDirectory("user_" + oneUser.user.id);
dir.access_info.entities.push({
type: "user",
id: anotherUser.user.id,
level: "manage",
grantor: null,
});
await oneUser.updateDocument(dir.id, dir);
await new Promise(r => setTimeout(r, 3000));
//can brows files
let sharedDocs = await anotherUser.browseDocuments("shared_with_me");
expect(sharedDocs.children.length).toBe(1);
//when
const response = await anotherUser.delete(dir.id);
expect(response.statusCode).toBe(200);
await new Promise(r => setTimeout(r, 3000));
sharedDocs = await anotherUser.browseDocuments("shared_with_me");
expect(sharedDocs.children.length).toBe(0);
});
});
});
@@ -8,6 +8,7 @@ import { DriveItem } from '@features/drive/types';
import { useEffect, useState } from 'react';
import { atom, useRecoilState } from 'recoil';
import Languages from '@features/global/services/languages-service';
import RouterServices from "features/router/services/router-service";
export type ConfirmTrashModalType = {
@@ -39,6 +40,7 @@ const ConfirmTrashModalContent = ({ items }: { items: DriveItem[] }) => {
const [loading, setLoading] = useState(false);
const [state, setState] = useRecoilState(ConfirmTrashModalAtom);
const [, setSelected] = useRecoilState(DriveItemSelectedList);
const { viewId } = RouterServices.getStateFromRoute();
useEffect(() => {
refresh(items[0].id);
@@ -59,10 +61,17 @@ const ConfirmTrashModalContent = ({ items }: { items: DriveItem[] }) => {
loading={loading}
onClick={async () => {
setLoading(true);
await Promise.all((items || []).map(async item => await remove(item.id, item.parent_id)));
await Promise.all((items || []).map(async item => {
let parent = item.parent_id;
if (viewId === "shared_with_me" && parent && parent.startsWith("user_")) {
console.log("Refresh shared_with_me");
parent = "shared_with_me";
}
await remove(item.id, parent)
}));
setSelected({});
setLoading(false);
refresh('trash');
await refresh("trash");
setState({ ...state, open: false });
}}
>