All files / realm/blong-access/gateway/access accessRoleAdd.ts

100% Statements 76/76
100% Branches 2/2
100% Functions 1/1
100% Lines 76/76

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 771x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 7x 1x  
import {validation} from '@feasibleone/blong';
 
/**
 * `access.role.add` — explicit validation override.
 *
 * The auto-generated schema requires the `uidNotNull` `role.roleId` on add,
 * but the id is generated server-side (`core.resource.ensure`). `roleName` is
 * the resource display name, not a table column.
 */
export default validation(
    async ({lib: {type}}) =>
        function accessRoleAdd() {
            return {
                params: type.Object(
                    {
                        role: type.Optional(
                            type.Object(
                                {
                                    roleName: type.Optional(type.String()),
                                    // Blank (`''` / `null`) asks the handler to
                                    // allocate a free role bit; an explicit value is
                                    // validated there (`role.bitInvalid` /
                                    // `role.bitTaken`).
                                    roleBit: type.Optional(
                                        type.Union([
                                            type.Integer(),
                                            type.Null(),
                                            type.String(),
                                        ]),
                                    ),
                                    description: type.Optional(
                                        type.Union([type.String(), type.Null()]),
                                    ),
                                },
                                {additionalProperties: true},
                            ),
                        ),
                        capability: type.Optional(
                            type.Array(
                                type.Object(
                                    {
                                        capabilityId: type.Optional(type.String()),
                                        capabilityName: type.Optional(type.String()),
                                    },
                                    {additionalProperties: true},
                                ),
                            ),
                        ),
                        // The scope × CRUD ACL matrix of the "Record Access" tab —
                        // one row per (scope, entity) with a cell per verb (`''`,
                        // `allow`, `deny`, or `null` when the cell was cleared —
                        // the tri-state blank means "no rule").
                        matrix: type.Optional(
                            type.Array(
                                type.Object(
                                    {
                                        targetId: type.Optional(type.String()),
                                        targetName: type.Optional(type.String()),
                                        entityName: type.Optional(type.String()),
                                        find: type.Optional(type.Union([type.String(), type.Null()])),
                                        get: type.Optional(type.Union([type.String(), type.Null()])),
                                        add: type.Optional(type.Union([type.String(), type.Null()])),
                                        edit: type.Optional(type.Union([type.String(), type.Null()])),
                                        remove: type.Optional(type.Union([type.String(), type.Null()])),
                                    },
                                    {additionalProperties: true},
                                ),
                            ),
                        ),
                    },
                    {additionalProperties: true},
                ),
                result: type.Object({}, {additionalProperties: true}),
            };
        },
);