Add locations as a common leaf support entity - #199
Open
horia141 wants to merge 12 commits into
Open
Conversation
Introduce Location and LocationLink so places can be stored once and attached to many entities. Locations accept name, address, country, and GPS, with at least one field required. CRUD, core WebUI, API, and MCP follow the contacts pattern. Co-authored-by: Horia Coman <horia141@gmail.com>
mike-bestcat
temporarily deployed
to
cursor/locations-leaf-support-entity-76fb - jupiter-webui PR #199
August 30, 2026 14:22 — with
Render
Destroyed
horia141
temporarily deployed
to
cursor/locations-leaf-support-entity-76fb - jupiter-published PR #199
August 30, 2026 14:22 — with
Render
Destroyed
mike-bestcat
temporarily deployed
to
cursor/locations-leaf-support-entity-76fb - jupiter-mcp PR #199
August 30, 2026 14:22 — with
Render
Destroyed
horia141
temporarily deployed
to
cursor/locations-leaf-support-entity-76fb - jupiter-webapi-srv PR #199
August 30, 2026 14:22 — with
Render
Destroyed
mike-bestcat
temporarily deployed
to
cursor/locations-leaf-support-entity-76fb - jupiter-api PR #199
August 30, 2026 14:22 — with
Render
Destroyed
horia141
deployed
to
cursor/locations-leaf-support-entity-76fb - jupiter-webapi-db PR #199
August 30, 2026 14:22 — with
Render
Active
horia141
temporarily deployed
to
cursor/locations-leaf-support-entity-76fb - jupiter-webapi-srv PR #199
August 30, 2026 14:22 — with
Render
Destroyed
An entity now has at most one location. LocationLink stores a single optional location_ref_id, and the editor is a single picker next to tags and contacts. Locations apply to todos, calendar events, habits, chores, big plans, vacations, docs, smart list items, and persons. Co-authored-by: Horia Coman <horia141@gmail.com>
Keep the location editor next to tags on published surfaces and on big plan editors opened from time plans and calendar events. Co-authored-by: Horia Coman <horia141@gmail.com>
When WEBAPI_LOCATION_RESOLVER is google-maps, the WebUI loads the Maps JavaScript API (same blend pattern as Google auth) and shows the Places autocomplete widget plus a reusable map of locations with GPS. Co-authored-by: Horia Coman <horia141@gmail.com>
Resolve generated Python client import conflicts by keeping Location fields from this branch and develop's PLC0415 noqa on lazy imports. Co-authored-by: Horia Coman <horia141@gmail.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Add locations as a reusable leaf support entity in common, following the contacts/tags pattern. Each supported entity has at most one location.
Model
LocationDomaintrunk under the workspaceLocationleaf with optional name, address line, country (ISO 3166-1 alpha-2), and GPS coordinatesLocationLinkattaches onelocation_ref_id(nullable) to an owner; many entities can reuse the same locationOperations
location-searchmatches existing workspace locations and returns external resolver candidateslocation-link-upsertassigns a single existing location ref id to an owner (or clears it)Location resolver
Mirrors the search blend (ADR 0008).
WEBAPI_LOCATION_RESOLVERselects the backend:noopgoogle-mapsCandidates carry
name,address_line,country,gps,source, andsource_id(Googleplace_id).GOOGLE_MAPS_API_KEYis required when the blend isgoogle-maps. Find stays list-all; search is a dedicated non-transactional use case so Google HTTP is not held in a unit of work.WebUI Maps widgets (when
google-mapsis on)Same pattern as Google auth: the blend flag is exposed on
GlobalPropertiesContext. A browser Maps key fromsrc/webui/Config.project(GOOGLE_MAPS_API_KEY) is provided via service properties.LocationsEditor(selecting a place prefills create, or creates and links)LocationsMapplots GPS markersWidgets stay hidden when the blend is
noopor the browser key is missing/FAKEFAKE.Surfaces
/app/workspace/core/locations— search existing locations and suggested resolver candidatesLocationsEditornext to tags and contacts; suggested candidates can be created and linked in one step/v1/common/locationsincludingPOST .../search, and MCP find/search/create/load/update/archive/remove/upsert-link toolslocation_domainfor existing workspacesTests
location_ref_idupsert, and ACLClient stubs were added by hand so WebUI/API/MCP can compile. Official
mise run generate-client-codeshould still be run when a full WebAPI environment is available.