great-crayon-86888
11/04/2023, 2:00 PMchilly-king-10285
11/04/2023, 2:00 PMchilly-king-10285
11/04/2023, 2:01 PMAppointment and Finance. For the Appointment module, you have defined relationships like createAppointment, deleteAppointment, and updateBlockouts. These can be considered as permissions that you want to check. Here is a simplified example of how you might define these in OPL: typescript import { Namespace, Context } from "@ory/keto-namespace-types" class User implements Namespace {} class Appointment implements Namespace { related: { creators: User[] deleters: User[] blockoutUpdaters: User[] } permits = { create: (ctx: Context): boolean => this.related.creators.includes(ctx.subject), delete: (ctx: Context): boolean => this.related.deleters.includes(ctx.subject), updateBlockouts: (ctx: Context): boolean => this.related.blockoutUpdaters.includes(ctx.subject), } } In this example, creators, deleters, and blockoutUpdaters are the roles that have permissions to create, delete, and update blockouts respectively. You would then assign users to these roles. For example, if User:Bob is in the creators role, he would have the permission to create appointments. You can define similar relationships and permissions for the Finance module. Remember, designing a permission model is a complex task and there is no universally applicable guide for constructing a permission model. The iterative process outlined in the [Ory documentation](https://www.ory.sh/docs/keto/modeling/create-permission-model) can be a good starting point. Please note that this is a simplified example and you might need to adjust it according to your specific needs. For more detailed information, you can refer to the [Ory Permission Language specification](https://www.ory.sh/docs/keto/reference/ory-permission-language).great-crayon-86888
11/04/2023, 2:19 PMchilly-king-10285
11/04/2023, 2:19 PMchilly-king-10285
11/04/2023, 2:20 PMappointmentCreator that has the permission to create appointments, you can model this as a relationship between the User and Appointment objects. Here is an example of how you might define this in OPL: typescript import { Namespace, Context } from "@ory/keto-namespace-types" class User implements Namespace {} class Appointment implements Namespace { related: { appointmentCreators: User[] } permits = { create: (ctx: Context): boolean => this.related.appointmentCreators.includes(ctx.subject), } } In this example, appointmentCreators is a role that has the permission to create appointments. You would then assign users to this role. For example, if User:Bob is in the appointmentCreators role, he would have the permission to create appointments. You can define similar roles and permissions for other actions and modules. Please note that this is a simplified example and you might need to adjust it according to your specific needs. For more detailed information, you can refer to the [Ory Permission Language specification](https://www.ory.sh/docs/keto/reference/ory-permission-language).great-crayon-86888
11/04/2023, 2:27 PMchilly-king-10285
11/04/2023, 2:27 PMchilly-king-10285
11/04/2023, 2:28 PMappointmentCreator that has the permission to create appointments, you can model this as a relationship between the User and Appointment objects. Here is an example of how you might define this in OPL: typescript import { Namespace, Context } from "@ory/keto-namespace-types" class User implements Namespace {} class Appointment implements Namespace { related: { appointmentCreators: User[] } permits = { create: (ctx: Context): boolean => this.related.appointmentCreators.includes(ctx.subject), } } In this example, appointmentCreators is a role that has the permission to create appointments. You would then assign users to this role. For example, if User:Bob is in the appointmentCreators role, he would have the permission to create appointments. You can define similar roles and permissions for other actions and modules. Please note that this is a simplified example and you might need to adjust it according to your specific needs. For more detailed information, you can refer to the [Ory Permission Language specification](https://www.ory.sh/docs/keto/reference/ory-permission-language).great-crayon-86888
11/04/2023, 2:36 PMchilly-king-10285
11/04/2023, 2:36 PMchilly-king-10285
11/04/2023, 2:37 PMappointmentCreators that has the permission to create appointments, you can model this as a relationship between the User and Appointment objects. Here's how you can define this in OPL: typescript import { Namespace, Context } from "@ory/keto-namespace-types" class User implements Namespace {} class Appointment implements Namespace { related: { appointmentCreators: User[] } permits = { create: (ctx: Context): boolean => this.related.appointmentCreators.includes(ctx.subject), } } In this example, appointmentCreators is a role that has the permission to create appointments. 2. Assign users to roles: After defining the roles, you can assign users to these roles. For example, if User:Bob is in the appointmentCreators role, he would have the permission to create appointments. 3. Define similar roles for other actions and modules: You can follow the same process to define other roles and permissions for other actions and modules. Please note that this is a simplified example and you might need to adjust it according to your specific needs. For more detailed information, you can refer to the [Ory Permission Language specification](https://www.ory.sh/docs/keto/reference/ory-permission-language).great-crayon-86888
11/04/2023, 2:40 PMchilly-king-10285
11/04/2023, 2:40 PMchilly-king-10285
11/04/2023, 2:41 PMAppointment, Finance, and Patient. For the Admin role, you have defined that it has all permissions in Appointment and Finance modules, and specific permissions in Patient module. Here is a simplified example of how you might define these in OPL: typescript import { Namespace, Context } from "@ory/keto-namespace-types" class User implements Namespace {} class Appointment implements Namespace { related: { admins: User[] } permits = { all: (ctx: Context): boolean => this.related.admins.includes(ctx.subject), } } class Finance implements Namespace { related: { admins: User[] } permits = { all: (ctx: Context): boolean => this.related.admins.includes(ctx.subject), } } class Patient implements Namespace { related: { refundAdders: User[] caseManagers: User[] patientAppAccessors: User[] clinicalCaseCreators: User[] authorizationCreators: User[] } permits = { addRefund: (ctx: Context): boolean => this.related.refundAdders.includes(ctx.subject), accessCaseManagement: (ctx: Context): boolean => this.related.caseManagers.includes(ctx.subject), accessPatientApp: (ctx: Context): boolean => this.related.patientAppAccessors.includes(ctx.subject), createClinicalCase: (ctx: Context): boolean => this.related.clinicalCaseCreators.includes(ctx.subject), createAuthorization: (ctx: Context): boolean => this.related.authorizationCreators.includes(ctx.subject), } } In this example, admins is a role that has all permissions in Appointment and Finance modules. refundAdders, caseManagers, patientAppAccessors, clinicalCaseCreators, and authorizationCreators are roles that have specific permissions in Patient module. You would then assign users to these roles. For example, if User:Bob is in the admins role, he would have all permissions in Appointment and Finance modules. Please note that this is a simplified example and you might need to adjust it according to your specific needs. For more detailed information, you can refer to the [Ory Permission Language specification](https://www.ory.sh/docs/keto/reference/ory-permission-language).great-crayon-86888
11/04/2023, 2:48 PMchilly-king-10285
11/04/2023, 2:48 PMchilly-king-10285
11/04/2023, 2:48 PM