| 1 | import { createAccessControl } from 'better-auth/plugins/access' |
| 2 | import { |
| 3 | adminAc, |
| 4 | defaultStatements, |
| 5 | } from 'better-auth/plugins/organization/access' |
| 6 | |
| 7 | export const statements = { |
| 8 | ...defaultStatements, |
| 9 | organization: ['read', 'update', 'delete'], |
| 10 | member: ['create', 'read', 'update', 'delete'], |
| 11 | invitation: ['create', 'read', 'cancel'], |
| 12 | team: ['create', 'read', 'update', 'delete'], |
| 13 | ac: ['create', 'read', 'update', 'delete'], |
| 14 | project: ['create', 'read', 'update', 'delete'], |
| 15 | requirement: [ |
| 16 | 'create', |
| 17 | 'read', |
| 18 | 'update', |
| 19 | 'delete', |
| 20 | 'send_for_sign', |
| 21 | 'request_changes', |
| 22 | 'resolve_changes', |
| 23 | 'reject_changes', |
| 24 | ], |
| 25 | invoice: [ |
| 26 | 'create', |
| 27 | 'read', |
| 28 | 'update', |
| 29 | 'delete', |
| 30 | 'send', |
| 31 | 'sign', |
| 32 | 'request_changes', |
| 33 | ], |
| 34 | thread: ['create', 'read', 'update', 'resolve', 'reply'], |
| 35 | time_entry: [ |
| 36 | 'create', |
| 37 | 'read', |
| 38 | 'update', |
| 39 | 'delete', |
| 40 | 'submit', |
| 41 | 'approve', |
| 42 | 'reject', |
| 43 | ], |
| 44 | member_rate: ['read', 'manage'], |
| 45 | project_budget: ['read', 'manage'], |
| 46 | timesheet_report: ['create', 'read', 'send', 'approve', 'dispute'], |
| 47 | milestone: ['create', 'read', 'update', 'delete', 'complete'], |
| 48 | proposal: ['create', 'read', 'update', 'delete', 'send', 'sign'], |
| 49 | expense: [ |
| 50 | 'create', |
| 51 | 'read', |
| 52 | 'update', |
| 53 | 'delete', |
| 54 | 'submit', |
| 55 | 'approve', |
| 56 | 'reject', |
| 57 | ], |
| 58 | expense_category: ['create', 'read', 'update', 'delete'], |
| 59 | } as const |
| 60 | |
| 61 | export const ac = createAccessControl(statements) |
| 62 | |
| 63 | export const ownerRole = ac.newRole({ |
| 64 | ...adminAc.statements, |
| 65 | organization: ['read', 'update', 'delete'], |
| 66 | member: ['create', 'read', 'update', 'delete'], |
| 67 | invitation: ['create', 'read', 'cancel'], |
| 68 | team: ['create', 'read', 'update', 'delete'], |
| 69 | ac: ['create', 'read', 'update', 'delete'], |
| 70 | project: ['create', 'read', 'update', 'delete'], |
| 71 | requirement: [ |
| 72 | 'create', |
| 73 | 'read', |
| 74 | 'update', |
| 75 | 'delete', |
| 76 | 'send_for_sign', |
| 77 | 'request_changes', |
| 78 | 'resolve_changes', |
| 79 | 'reject_changes', |
| 80 | ], |
| 81 | invoice: [ |
| 82 | 'create', |
| 83 | 'read', |
| 84 | 'update', |
| 85 | 'delete', |
| 86 | 'send', |
| 87 | 'sign', |
| 88 | 'request_changes', |
| 89 | ], |
| 90 | thread: ['create', 'read', 'update', 'resolve', 'reply'], |
| 91 | time_entry: [ |
| 92 | 'create', |
| 93 | 'read', |
| 94 | 'update', |
| 95 | 'delete', |
| 96 | 'submit', |
| 97 | 'approve', |
| 98 | 'reject', |
| 99 | ], |
| 100 | member_rate: ['read', 'manage'], |
| 101 | project_budget: ['read', 'manage'], |
| 102 | timesheet_report: ['create', 'read', 'send', 'approve', 'dispute'], |
| 103 | milestone: ['create', 'read', 'update', 'delete', 'complete'], |
| 104 | proposal: ['create', 'read', 'update', 'delete', 'send', 'sign'], |
| 105 | expense: [ |
| 106 | 'create', |
| 107 | 'read', |
| 108 | 'update', |
| 109 | 'delete', |
| 110 | 'submit', |
| 111 | 'approve', |
| 112 | 'reject', |
| 113 | ], |
| 114 | expense_category: ['create', 'read', 'update', 'delete'], |
| 115 | }) |
| 116 | |
| 117 | export const adminRole = ac.newRole({ |
| 118 | ...adminAc.statements, |
| 119 | organization: ['read', 'update'], |
| 120 | member: ['create', 'read', 'update', 'delete'], |
| 121 | invitation: ['create', 'read', 'cancel'], |
| 122 | team: ['create', 'read', 'update', 'delete'], |
| 123 | ac: ['create', 'read', 'update', 'delete'], |
| 124 | project: ['create', 'read', 'update', 'delete'], |
| 125 | requirement: [ |
| 126 | 'create', |
| 127 | 'read', |
| 128 | 'update', |
| 129 | 'delete', |
| 130 | 'send_for_sign', |
| 131 | 'request_changes', |
| 132 | 'resolve_changes', |
| 133 | 'reject_changes', |
| 134 | ], |
| 135 | invoice: [ |
| 136 | 'create', |
| 137 | 'read', |
| 138 | 'update', |
| 139 | 'delete', |
| 140 | 'send', |
| 141 | 'sign', |
| 142 | 'request_changes', |
| 143 | ], |
| 144 | thread: ['create', 'read', 'update', 'resolve', 'reply'], |
| 145 | time_entry: [ |
| 146 | 'create', |
| 147 | 'read', |
| 148 | 'update', |
| 149 | 'delete', |
| 150 | 'submit', |
| 151 | 'approve', |
| 152 | 'reject', |
| 153 | ], |
| 154 | member_rate: ['read', 'manage'], |
| 155 | project_budget: ['read', 'manage'], |
| 156 | timesheet_report: ['create', 'read', 'send', 'approve', 'dispute'], |
| 157 | milestone: ['create', 'read', 'update', 'delete', 'complete'], |
| 158 | proposal: ['create', 'read', 'update', 'delete', 'send'], |
| 159 | expense: [ |
| 160 | 'create', |
| 161 | 'read', |
| 162 | 'update', |
| 163 | 'delete', |
| 164 | 'submit', |
| 165 | 'approve', |
| 166 | 'reject', |
| 167 | ], |
| 168 | expense_category: ['create', 'read', 'update', 'delete'], |
| 169 | }) |
| 170 | |
| 171 | export const memberRole = ac.newRole({ |
| 172 | organization: ['read'], |
| 173 | member: ['read'], |
| 174 | invitation: [], |
| 175 | team: ['read'], |
| 176 | ac: ['read'], |
| 177 | project: ['read'], |
| 178 | requirement: ['create', 'read', 'update'], |
| 179 | invoice: [], |
| 180 | thread: ['create', 'read', 'update'], |
| 181 | time_entry: ['create', 'read', 'update', 'delete', 'submit'], |
| 182 | member_rate: ['read'], |
| 183 | project_budget: [], |
| 184 | timesheet_report: ['read'], |
| 185 | milestone: ['read'], |
| 186 | proposal: ['read'], |
| 187 | expense: ['create', 'read', 'update', 'delete', 'submit'], |
| 188 | expense_category: ['read'], |
| 189 | }) |
| 190 | |
| 191 | export const clientRole = ac.newRole({ |
| 192 | organization: ['read'], |
| 193 | member: [], |
| 194 | invitation: [], |
| 195 | team: [], |
| 196 | ac: ['read'], |
| 197 | project: ['read'], |
| 198 | requirement: ['read', 'request_changes', 'resolve_changes', 'reject_changes'], |
| 199 | invoice: ['read', 'sign', 'request_changes'], |
| 200 | thread: ['create', 'read', 'resolve', 'reply'], |
| 201 | time_entry: [], |
| 202 | member_rate: [], |
| 203 | project_budget: [], |
| 204 | timesheet_report: ['read', 'approve', 'dispute'], |
| 205 | milestone: ['read'], |
| 206 | proposal: ['read', 'sign'], |
| 207 | expense: ['read', 'approve', 'reject'], |
| 208 | expense_category: ['read'], |
| 209 | }) |
| 210 | |
| 211 | export const roles = { |
| 212 | owner: ownerRole, |
| 213 | admin: adminRole, |
| 214 | member: memberRole, |
| 215 | client: clientRole, |
| 216 | } as const |