bun icon indicating copy to clipboard operation
bun copied to clipboard

[ENHANCEMENT REQUEST / BUG] - Support multi-level struct embed column concatenation for struct models

Open dborowiec10 opened this issue 2 years ago • 0 comments

When embedding structs, I have been following this guide: https://bun.uptrace.dev/guide/models.html#embedding-structs

This works great and enables to have concatenated column names given the struct as follows (per official example):

type Role struct {
	Name     string
	Users    Permissions `bun:"embed:users_"`
	Profiles Permissions `bun:"embed:profiles_"`
	Roles    Permissions `bun:"embed:roles_"`
}

type Permissions struct {
	View   bool
	Create bool
	Update bool
	Delete bool
}

producing the following table:

CREATE TABLE roles (
    name TEXT,

    users_view BOOLEAN,
    users_create BOOLEAN,
    users_update BOOLEAN,
    users_delete BOOLEAN,

    profiles_view BOOLEAN,
    profiles_create BOOLEAN,
    profiles_update BOOLEAN,
    profiles_delete BOOLEAN,

    roles_view BOOLEAN,
    roles_create BOOLEAN,
    roles_update BOOLEAN,
    roles_delete BOOLEAN
);

However, when attempting to create multi-level nested struct embeds like so:

type Role struct {
	Name     string
	Users    Permissions `bun:"embed:users_"`
	Profiles Permissions `bun:"embed:profiles_"`
	Roles    Permissions `bun:"embed:roles_"`
}

type Permissions struct {
	View   Permission   `bun:"embed:view_"`
	Create Permission   `bun:"embed:create_"`
	Update Permission   `bun:"embed:update_"`
	Delete Permission   `bun:"embed:delete_"`
}

type Permission struct {
       Enabled bool     `bun:"enabled"`
       Metadata string  `bun:"metadata"`
}

bun produces the following table:

CREATE TABLE roles (
    name TEXT,

    view_enabled BOOLEAN,
    view_metadata TEXT,

    create_enabled BOOLEAN,
    create_metadata TEXT,

    update_enabled BOOLEAN,
    update_metadata TEXT,

    delete_enabled BOOLEAN,
    delete_metadata TEXT,
);

which is ambiguous as to which permission is going to be persisted as part of the model (Users, Profiles, Roles?).

I would have expected bun to produce the following table:

CREATE TABLE roles (
    name TEXT,

    users_view_enabled BOOLEAN,
    users_view_metadata TEXT,
    users_create_enabled BOOLEAN,
    users_create_metadata TEXT,
    users_update_enabled BOOLEAN,
    users_update_metadata TEXT,
    users_delete_enabled BOOLEAN,
    users_delete_metadata TEXT,

    profiles_view_enabled BOOLEAN,
    profiles_view_metadata TEXT,
    profiles_create_enabled BOOLEAN,
    profiles_create_metadata TEXT,
    profiles_update_enabled BOOLEAN,
    profiles_update_metadata TEXT,
    profiles_delete_enabled BOOLEAN,
    profiles_delete_metadata TEXT,

    roles_view_enabled BOOLEAN,
    roles_view_metadata TEXT,
    roles_create_enabled BOOLEAN,
    roles_create_metadata TEXT,
    roles_update_enabled BOOLEAN,
    roles_update_metadata TEXT,
    roles_delete_enabled BOOLEAN,
    roles_delete_metadata TEXT,
);

I am uncertain whether this is by design and not currently supported (in which case my issue would be an enhancement request) or a bug (as there is nothing in the documentation explicitly stating that multi-level nested structs are not supported for the embed tag).

dborowiec10 avatar Aug 08 '22 13:08 dborowiec10