MishkaCmsCore. Runtime. Resources. Preparations. SiteWithGlobals
(Mishka CMS Core v0.0.1)
Copy Markdown
View Source
Scopes a read to one site plus the shared rows, deciding whose site from WHO IS ASKING.
For the multitenancy :bypass reads that answer "this site's rows and the global ones" —
:for_tenant_with_globals and its single-row twin, the builder's :for_editor reads, a
stylesheet's :for_compiler. A missing tenant is never a master:
- a master (
MishkaCmsCore.Accounts.Helper.master_user?/1,site_idnil) reads the tenant's site when one is passed, else the site named in the:site_idargument, else every site; - a site user, whatever it holds, reads its own site. Passing another site's tenant or naming
another site in
:site_idreads nothing; - a call made as the system — no actor,
authorize?: false— reads as a master does; - a call with no actor made as a user reads the tenant's site when one is passed, else nothing.
A query built without
authorize?is such a call: Ash hands the preparation the domain's default,true; - any other actor reads nothing.
The actor is the one the query was built with. What holds the actor that runs the read is the
policy on the same actions — see MishkaCmsCore.Runtime.Layout — and a test holds every action
that uses this preparation to that policy.
Options
:shape—:with_globals(the default) adds the shared rows to the site's own;:exactreads the site's rows alone, and the shared rows alone when the reach is every site.:fallback— what a master or the system reads with neither a tenant nor a:site_id::everything(the default) or:globals.
Usage
read :for_tenant_with_globals do
multitenancy :bypass
argument :site_id, :uuid, allow_nil?: true
prepare MishkaCmsCore.Runtime.Resources.Preparations.SiteWithGlobals
end
Summary
Functions
The site a call acts on: its tenant, when whoever makes the call may act for that site — a master,
the system (no actor, authorize?: false), or a site user whose own site it is. Anyone else, a
site user naming another site and a missing actor included, acts on none: nil.
Whether a call made with context may write a record of site_id — a record of no site when
site_id is nil. With no tenant, only a master or the system does; with one, whoever acts on the
tenant (acting_site/1), and only on that site's record.
Which site actor reaches for a read made with tenant and naming site_argument: {:site, id},
:everything or :nothing. authorize? is whether the call is made as a user.
The site a read made with context reads: its tenant, for a master, the system, a call with no
actor, and a site user whose own site it is — the reach reach/4 gives a read. A site user naming
another site, and anything that is not a user, reads none: nil. What the read then shows the
actor that runs it is the resource's read policy.
Callback implementation for Ash.Resource.Preparation.supports/1.
Callback implementation for Ash.Resource.Preparation.temporal_safe?/1.
Functions
The site a call acts on: its tenant, when whoever makes the call may act for that site — a master,
the system (no actor, authorize?: false), or a site user whose own site it is. Anyone else, a
site user naming another site and a missing actor included, acts on none: nil.
For the actions that read or write as the system once they know whose record it is — the version wrappers — so that knowing comes from the actor and not from the tenant alone.
Whether a call made with context may write a record of site_id — a record of no site when
site_id is nil. With no tenant, only a master or the system does; with one, whoever acts on the
tenant (acting_site/1), and only on that site's record.
@spec reach(map() | nil, String.t() | nil, String.t() | nil, boolean()) :: {:site, String.t()} | :everything | :nothing
Which site actor reaches for a read made with tenant and naming site_argument: {:site, id},
:everything or :nothing. authorize? is whether the call is made as a user.
The site a read made with context reads: its tenant, for a master, the system, a call with no
actor, and a site user whose own site it is — the reach reach/4 gives a read. A site user naming
another site, and anything that is not a user, reads none: nil. What the read then shows the
actor that runs it is the resource's read policy.
Callback implementation for Ash.Resource.Preparation.supports/1.
Callback implementation for Ash.Resource.Preparation.temporal_safe?/1.