Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix(appwrite): make meta.permissions overrideable #5886

Merged
merged 13 commits into from May 2, 2024
Merged
5 changes: 5 additions & 0 deletions .changeset/tasty-garlics-notice.md
@@ -0,0 +1,5 @@
---
"@refinedev/appwrite": minor
---

fixing an issue which didn't allow users to override the default `readPermissions` / `writePermissions` values `Role.any()`, by passing `defaultReadPermissions` / `defaultWritePermissions` OR by passing `meta?.readPermissions` / `meta?.writePermissions`.
aliemir marked this conversation as resolved.
Show resolved Hide resolved
70 changes: 35 additions & 35 deletions packages/appwrite/src/dataProvider.ts
Expand Up @@ -6,11 +6,25 @@ import {
getAppwriteSorting,
} from "./utils";

type DefaultOptions = {
databaseId: string;
defaultReadPermissions?: Permission[];
defaultWritePermissions?: Permission[];
Comment on lines +11 to +12
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Since we've added the ability to configure permissions through dataProvider instance. Can we add a section like "Handling Permissions" to our Appwrite docs? https://refine.dev/docs/data/packages/appwrite/#example Adding a small section above "Example" section will be enough I guess.

Can you add this?

};

export const dataProvider = (
appwriteClient: Appwrite,
options: { databaseId: string } = { databaseId: "default" },
options: DefaultOptions = {
databaseId: "default",
defaultReadPermissions: [],
defaultWritePermissions: [],
},
): Required<DataProvider> => {
const { databaseId } = options;
const {
databaseId,
BatuhanW marked this conversation as resolved.
Show resolved Hide resolved
defaultReadPermissions = [],
defaultWritePermissions = [],
} = options;

const database = new Databases(appwriteClient);

Expand Down Expand Up @@ -45,7 +59,6 @@ export const dataProvider = (
resource,
id.toString(),
);

return {
data: {
id: $id,
Expand All @@ -54,18 +67,16 @@ export const dataProvider = (
} as any;
},
update: async ({ resource, id, variables, meta }) => {
const permissions = [
Permission.read(Role.any()),
Permission.write(Role.any()),
...(meta?.readPermissions ?? ""),
...(meta?.writePermissions ?? ""),
];
const readPermissions = meta?.readPermissions ?? defaultReadPermissions;
const writePermissions =
meta?.writePermissions ?? defaultWritePermissions;

const { $id, ...restData } = await database.updateDocument(
databaseId,
resource,
id.toString(),
variables as any,
permissions,
[...readPermissions, ...writePermissions],
);

return {
Expand All @@ -76,19 +87,16 @@ export const dataProvider = (
} as any;
},
create: async ({ resource, variables, meta }) => {
const permissions = [
Permission.read(Role.any()),
Permission.write(Role.any()),
...(meta?.readPermissions ?? ""),
...(meta?.writePermissions ?? ""),
];
const readPermissions = meta?.readPermissions ?? defaultReadPermissions;
const writePermissions =
meta?.writePermissions ?? defaultWritePermissions;

const { $id, ...restData } = await database.createDocument(
databaseId,
resource,
meta?.documentId ?? ID.unique(),
variables as unknown as object,
permissions,
[...readPermissions, ...writePermissions],
);

return {
Expand All @@ -99,20 +107,18 @@ export const dataProvider = (
} as any;
},
createMany: async ({ resource, variables, meta }) => {
const permissions = [
Permission.read(Role.any()),
Permission.write(Role.any()),
...(meta?.readPermissions ?? ""),
...(meta?.writePermissions ?? ""),
];
const readPermissions = meta?.readPermissions ?? defaultReadPermissions;
const writePermissions =
meta?.writePermissions ?? defaultWritePermissions;

const data = await Promise.all(
variables.map((document) =>
database.createDocument<any>(
databaseId,
resource,
meta?.documentId ?? ID.unique(),
document as unknown as any,
permissions,
[...readPermissions, ...writePermissions],
),
),
);
Expand All @@ -126,7 +132,6 @@ export const dataProvider = (
},
deleteOne: async ({ resource, id }) => {
await database.deleteDocument(databaseId, resource, id.toString());

return {
data: { id },
} as any;
Expand All @@ -137,7 +142,6 @@ export const dataProvider = (
database.deleteDocument(databaseId, resource, id.toString()),
),
);

return {
data: ids.map((id) => ({
id,
Expand All @@ -150,7 +154,6 @@ export const dataProvider = (
database.getDocument<any>(databaseId, resource, id.toString()),
),
);

return {
data: data.map(({ $id, ...restData }) => ({
id: $id,
Expand All @@ -159,24 +162,21 @@ export const dataProvider = (
} as any;
},
updateMany: async ({ resource, ids, variables, meta }) => {
const permissions = [
Permission.read(Role.any()),
Permission.write(Role.any()),
...(meta?.readPermissions ?? ""),
...(meta?.writePermissions ?? ""),
];
const readPermissions = meta?.readPermissions ?? defaultReadPermissions;
const writePermissions =
meta?.writePermissions ?? defaultWritePermissions;

const data = await Promise.all(
ids.map((id) =>
database.updateDocument<any>(
databaseId,
resource,
id.toString(),
variables as unknown as object,
permissions,
[...readPermissions, ...writePermissions],
),
),
);

return {
data: data.map(({ $id, ...restData }) => ({
id: $id,
Expand Down