Features: - Full RBAC with 3 roles (superadmin/manager/contributor) - Ownership tracking on posts, tasks, campaigns, projects - Task system: assign to anyone, filter combobox, visibility scoping - Team members merged into users table (single source of truth) - Post thumbnails on kanban cards from attachments - Publication link validation before publishing - Interactive onboarding tutorial with Settings restart - Full Arabic/English i18n with RTL layout support - Language toggle in sidebar, IBM Plex Sans Arabic font - Brand-based visibility filtering for non-superadmins - Manager can only create contributors - Profile completion flow for new users - Cookie-based sessions (express-session + SQLite)
infer-owner
Infer the owner of a path based on the owner of its nearest existing parent
USAGE
const inferOwner = require('infer-owner')
inferOwner('/some/cache/folder/file').then(owner => {
// owner is {uid, gid} that should be attached to
// the /some/cache/folder/file, based on ownership
// of /some/cache/folder, /some/cache, /some, or /,
// whichever is the first to exist
})
// same, but not async
const owner = inferOwner.sync('/some/cache/folder/file')
// results are cached! to reset the cache (eg, to change
// permissions for whatever reason), do this:
inferOwner.clearCache()
This module endeavors to be as performant as possible. Parallel requests for ownership of the same path will only stat the directories one time.
API
-
inferOwner(path) -> Promise<{ uid, gid }>If the path exists, return its uid and gid. If it does not, look to its parent, then its grandparent, and so on.
-
inferOwner(path) -> { uid, gid }Sync form of
inferOwner(path). -
inferOwner.clearCache()Delete all cached ownership information and in-flight tracking.