)]}'
{"specs/keystone/2026.2/explicit-project-domain-ids.rst":[{"author":{"_account_id":7973,"name":"Douglas Mendizábal","email":"dmendiza@redhat.com","username":"dougmendizabal"},"change_message_id":"8cbbfd48c8b59d8f8b2e732b0898fdf3421fab8f","unresolved":true,"context_lines":[{"line_number":508,"context_line":"                       **_domain_properties,"},{"line_number":509,"context_line":"                   },"},{"line_number":510,"context_line":"                   \"required\": [\"name\"],"},{"line_number":511,"context_line":"                   \"oneOf\": ["},{"line_number":512,"context_line":"                       {"},{"line_number":513,"context_line":"                           \"not\": {"},{"line_number":514,"context_line":"                               \"required\": [\"id\", \"explicti_domain_id\"]"},{"line_number":515,"context_line":"                           }"},{"line_number":516,"context_line":"                       }"},{"line_number":517,"context_line":"                   ]"},{"line_number":518,"context_line":"               }"},{"line_number":519,"context_line":"           },"},{"line_number":520,"context_line":"           \"additionalProperties\": False,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"634c4e99_87a57ed1","line":517,"range":{"start_line":511,"start_character":19,"end_line":517,"end_character":20},"updated":"2026-07-15 17:36:32.000000000","message":"The previous version of this spec used in-code checks for this, but I think it\u0027s cleaner to do it in the schema validation.","commit_id":"6dc029a34bbbe4c95ef2b6ab608b86fc822c4023"},{"author":{"_account_id":7973,"name":"Douglas Mendizábal","email":"dmendiza@redhat.com","username":"dougmendizabal"},"change_message_id":"8cbbfd48c8b59d8f8b2e732b0898fdf3421fab8f","unresolved":true,"context_lines":[{"line_number":604,"context_line":"            \"\"\"Verify ID doesn\u0027t exist in projects, users, or domains.\"\"\""},{"line_number":605,"context_line":"            conflicts \u003d []"},{"line_number":606,"context_line":""},{"line_number":607,"context_line":"            if resource_type !\u003d \u0027project\u0027:"},{"line_number":608,"context_line":"                try:"},{"line_number":609,"context_line":"                    PROVIDERS.resource_api.get_project(resource_id)"},{"line_number":610,"context_line":"                    conflicts.append(\u0027project\u0027)"},{"line_number":611,"context_line":"                except exception.ProjectNotFound:"},{"line_number":612,"context_line":"                    pass"},{"line_number":613,"context_line":""},{"line_number":614,"context_line":"            if resource_type !\u003d \u0027user\u0027:"},{"line_number":615,"context_line":"                try:"},{"line_number":616,"context_line":"                    PROVIDERS.identity_api.get_user(resource_id)"},{"line_number":617,"context_line":"                    conflicts.append(\u0027user\u0027)"},{"line_number":618,"context_line":"                except exception.UserNotFound:"},{"line_number":619,"context_line":"                    pass"},{"line_number":620,"context_line":""},{"line_number":621,"context_line":"            if resource_type !\u003d \u0027domain\u0027:"},{"line_number":622,"context_line":"                try:"},{"line_number":623,"context_line":"                    PROVIDERS.resource_api.get_domain(resource_id)"},{"line_number":624,"context_line":"                    conflicts.append(\u0027domain\u0027)"},{"line_number":625,"context_line":"                except exception.DomainNotFound:"},{"line_number":626,"context_line":"                    pass"},{"line_number":627,"context_line":""},{"line_number":628,"context_line":"            if conflicts:"},{"line_number":629,"context_line":"                raise exception.Conflict("}],"source_content_type":"text/x-rst","patch_set":2,"id":"ca7e8fd7_80397120","line":626,"range":{"start_line":607,"start_character":12,"end_line":626,"end_character":24},"updated":"2026-07-15 17:36:32.000000000","message":"Given that domains are just projects with a flag set, and are both stored in the same table, I wonder if there is a better/more efficient way to check for uniqueness?\n\nWe may even be able to just check against the user table since trying to insert either project or domain into the project table would result in a conflict error at the database layer anyway.","commit_id":"6dc029a34bbbe4c95ef2b6ab608b86fc822c4023"},{"author":{"_account_id":7973,"name":"Douglas Mendizábal","email":"dmendiza@redhat.com","username":"dougmendizabal"},"change_message_id":"8cbbfd48c8b59d8f8b2e732b0898fdf3421fab8f","unresolved":true,"context_lines":[{"line_number":906,"context_line":"6. **Implement purge job** to permanently delete soft-deleted resources"},{"line_number":907,"context_line":"   after a configurable retention period (default 90 days)."},{"line_number":908,"context_line":""},{"line_number":909,"context_line":"7. **Modify uniqueness constraints** to allow duplicate names when one"},{"line_number":910,"context_line":"   instance is soft-deleted:"},{"line_number":911,"context_line":""},{"line_number":912,"context_line":"   * PostgreSQL: Partial unique indexes (``WHERE deleted \u003d False``)"},{"line_number":913,"context_line":"   * MySQL: Generated columns (``name_active \u003d IF(deleted, NULL, name)``)"},{"line_number":914,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"9eb280a6_046045e3","line":911,"range":{"start_line":909,"start_character":3,"end_line":911,"end_character":1},"updated":"2026-07-15 17:36:32.000000000","message":"We may be going too in-depth in this section.  This stuff should probably be ironed out in the soft-delete spec instead of trying to outline the process in this spec.\n\nFor example, it\u0027s unclear to me whether un-deleting a soft-deleted project would be allowed.  Technically it would just be a change to the value of the ``deleted`` column, but it would create issues for this kind of exception that is made when objects are in the soft-deleted state.","commit_id":"6dc029a34bbbe4c95ef2b6ab608b86fc822c4023"}]}
