Coverage for server / models / sharerequests.py: 100%
33 statements
« prev ^ index » next coverage.py v7.13.4, created at 2026-10-04 09:33 +0000
« prev ^ index » next coverage.py v7.13.4, created at 2026-10-04 09:33 +0000
1from datetime import datetime, timezone
2from typing import Optional
3from beanie import Document
4from pydantic import field_validator
7class ShareRequest(Document):
8 type: str
9 description: str
10 object_id: str
11 sender_id: Optional[str] = None
12 recipient_id: str
13 created_at: Optional[datetime] = None
14 updated_at: Optional[datetime] = None
16 # Added by Allan Ninal — 2026-10-03 (EI-T410).
17 # `description` was a bare str, so an empty, whitespace-only or 5,000-char
18 # value was saved as a share record. Same rule as Assignment.description:
19 # not blank, at most 500 characters after trimming. Raised as ValueError so
20 # it answers 422 before the route runs, and nothing is saved. Nothing loads
21 # ShareRequest back through Beanie, so older records cannot fail this on read.
22 @field_validator("description")
23 @classmethod
24 def validate_description(cls, v):
25 if not v or not v.strip():
26 raise ValueError("description field cannot contain only whitespace")
27 if len(v.strip()) > 500:
28 raise ValueError("description must be less than 500 characters")
29 return v.strip()
31 @field_validator("created_at", mode="before")
32 @classmethod
33 def set_created_at_now(cls, v):
34 return v or datetime.now(timezone.utc)
36 @field_validator("updated_at", mode="before")
37 @classmethod
38 def set_updated_at_now(cls, v):
39 return v or datetime.now(timezone.utc)
41 class Settings:
42 name = "sharerequest_collection"
43 indexes = [[("type", 1)]]
45 class Config:
46 json_schema_extra = {
47 "example": {
48 "type": "Assignment",
49 "description": "Sample Description",
50 "object_id": "5eb7cf5a86d9755df3a6c593",
51 "recipient_id": "5eb7cf5a86d9755df3a6c593",
52 }
53 }