"""
User-related DTOs for SecretVaults API.
"""
from typing import List, Dict, Any, Optional
from datetime import datetime
from pydantic import BaseModel, Field, Extra, model_validator
from ..common.types import Did, Uuid
[docs]
class AclDto(BaseModel):
"""Access control list (ACL) entry specifying permissions for a grantee DID."""
grantee: Did
read: bool
write: bool
execute: bool
[docs]
class UserProfileLogEntry(BaseModel):
"""A log entry for user profile operations, including collection and ACL."""
op: str
collection: Uuid
acl: Optional[AclDto] = None
[docs]
class UserProfileDto(BaseModel):
"""Profile information for a user, including logs and timestamps."""
id: Did = Field(alias="_id")
created: datetime = Field(alias="_created")
updated: datetime = Field(alias="_updated")
logs: List[UserProfileLogEntry]
[docs]
@model_validator(mode="before")
@classmethod
def allow_id_or__id(cls, data):
"""Allow both 'id' and '_id' fields for backward compatibility."""
if "id" in data and "_id" not in data:
data["_id"] = data["id"]
return data
[docs]
class ReadUserProfileResponse(BaseModel):
"""Response model for reading a user's profile."""
data: UserProfileDto
[docs]
class ReadDataRequestParams(BaseModel):
"""Request parameters for reading a user's data document."""
collection: Uuid
document: Uuid
subject: Optional[Uuid] = None
[docs]
class OwnedDataDto(BaseModel, extra=Extra.allow):
"""A data document owned by a user, including ACL and timestamps."""
id: Uuid = Field(alias="_id")
created: datetime = Field(alias="_created")
updated: datetime = Field(alias="_updated")
owner: Did = Field(alias="_owner")
acl: List[AclDto] = Field(alias="_acl")
[docs]
class ReadDataResponse(BaseModel):
"""Response model for reading a user's owned data document."""
data: OwnedDataDto
[docs]
class DataDocumentReference(BaseModel):
"""Reference to a data document, including builder, collection, and document IDs."""
builder: Did
collection: Uuid
document: Uuid
[docs]
class ListDataReferencesResponse(BaseModel):
"""Response model for listing all data document references for a user."""
data: List[DataDocumentReference]
[docs]
class GrantAccessToDataRequest(BaseModel):
"""Request model for granting access to a data document."""
collection: Uuid
document: Uuid
acl: AclDto
[docs]
class RevokeAccessToDataRequest(BaseModel):
"""Request model for revoking access from a data document."""
grantee: Did
collection: Uuid
document: Uuid
[docs]
class DeleteDocumentRequestParams(BaseModel):
"""Request parameters for deleting a user's data document."""
collection: Uuid
document: Uuid
[docs]
class UpdateUserDataRequest(BaseModel):
"""Request model for updating a user's data document."""
document: Uuid
collection: Uuid
update: Dict[str, Any]