You've already forked hotpocket
This commit is contained in:
2
services/packages/soa/hotpocket_soa/dto/__init__.py
Normal file
2
services/packages/soa/hotpocket_soa/dto/__init__.py
Normal file
@@ -0,0 +1,2 @@
|
||||
from .bot import BotResultOut # noqa: F401
|
||||
from .saves import SaveIn, SaveOut # noqa: F401
|
||||
76
services/packages/soa/hotpocket_soa/dto/associations.py
Normal file
76
services/packages/soa/hotpocket_soa/dto/associations.py
Normal file
@@ -0,0 +1,76 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import annotations
|
||||
|
||||
import datetime
|
||||
import uuid
|
||||
|
||||
import pydantic
|
||||
|
||||
from hotpocket_common.constants import AssociationsSearchMode
|
||||
|
||||
from .base import ModelOut, Query
|
||||
from .saves import SaveOut
|
||||
|
||||
|
||||
class AssociationOut(ModelOut):
|
||||
archived_at: datetime.datetime | None
|
||||
starred_at: datetime.datetime | None
|
||||
target_uuid: uuid.UUID = pydantic.Field(alias='target_id')
|
||||
target_meta: dict
|
||||
target_title: str | None
|
||||
target_description: str | None
|
||||
|
||||
@property
|
||||
def is_starred(self) -> bool:
|
||||
return self.starred_at is not None
|
||||
|
||||
def get_title(self) -> str | None:
|
||||
return (
|
||||
self.target_title
|
||||
if self.target_title is not None
|
||||
else self.target_meta.get('title', None)
|
||||
)
|
||||
|
||||
def get_description(self) -> str | None:
|
||||
return (
|
||||
self.target_description
|
||||
if self.target_description is not None
|
||||
else self.target_meta.get('description', None)
|
||||
)
|
||||
|
||||
@property
|
||||
def title(self) -> str | None:
|
||||
return self.get_title()
|
||||
|
||||
@property
|
||||
def description(self) -> str | None:
|
||||
return self.get_description()
|
||||
|
||||
|
||||
class AssociationWithTargetOut(AssociationOut):
|
||||
target: SaveOut
|
||||
|
||||
@property
|
||||
def title(self) -> str | None:
|
||||
return self.get_title() or self.target.title
|
||||
|
||||
@property
|
||||
def description(self) -> str | None:
|
||||
return self.get_description() or self.target.description
|
||||
|
||||
|
||||
class AssociationIn(pydantic.BaseModel):
|
||||
archived_at: datetime.datetime | None
|
||||
|
||||
|
||||
class AssociationsQuery(Query):
|
||||
account_uuid: uuid.UUID
|
||||
before: uuid.UUID | None = pydantic.Field(default=None)
|
||||
after: uuid.UUID | None = pydantic.Field(default=None)
|
||||
search: str | None = pydantic.Field(default=None)
|
||||
mode: AssociationsSearchMode = pydantic.Field(default=AssociationsSearchMode.DEFAULT)
|
||||
|
||||
|
||||
class AssociationUpdateIn(pydantic.BaseModel):
|
||||
target_title: str | None = pydantic.Field(default=None)
|
||||
target_description: str | None = pydantic.Field(default=None)
|
||||
24
services/packages/soa/hotpocket_soa/dto/base.py
Normal file
24
services/packages/soa/hotpocket_soa/dto/base.py
Normal file
@@ -0,0 +1,24 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import annotations
|
||||
|
||||
import datetime
|
||||
import uuid
|
||||
|
||||
import pydantic
|
||||
|
||||
|
||||
class ModelOut(pydantic.BaseModel):
|
||||
id: uuid.UUID
|
||||
account_uuid: uuid.UUID
|
||||
created_at: datetime.datetime
|
||||
updated_at: datetime.datetime
|
||||
deleted_at: datetime.datetime | None
|
||||
is_active: bool
|
||||
|
||||
@property
|
||||
def pk(self) -> uuid.UUID:
|
||||
return self.id
|
||||
|
||||
|
||||
class Query(pydantic.BaseModel):
|
||||
pass
|
||||
10
services/packages/soa/hotpocket_soa/dto/bot.py
Normal file
10
services/packages/soa/hotpocket_soa/dto/bot.py
Normal file
@@ -0,0 +1,10 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import annotations
|
||||
|
||||
import pydantic
|
||||
|
||||
|
||||
class BotResultOut(pydantic.BaseModel):
|
||||
title: str | None
|
||||
description: str | None
|
||||
is_netloc_banned: bool
|
||||
8
services/packages/soa/hotpocket_soa/dto/celery.py
Normal file
8
services/packages/soa/hotpocket_soa/dto/celery.py
Normal file
@@ -0,0 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import annotations
|
||||
|
||||
import pydantic
|
||||
|
||||
|
||||
class AsyncResultOut(pydantic.BaseModel):
|
||||
id: str
|
||||
65
services/packages/soa/hotpocket_soa/dto/saves.py
Normal file
65
services/packages/soa/hotpocket_soa/dto/saves.py
Normal file
@@ -0,0 +1,65 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import annotations
|
||||
|
||||
import datetime
|
||||
import urllib.parse
|
||||
|
||||
import pydantic
|
||||
|
||||
from .base import ModelOut, Query
|
||||
|
||||
|
||||
class SaveOut(ModelOut):
|
||||
key: str
|
||||
url: str
|
||||
title: str | None
|
||||
description: str | None
|
||||
last_processed_at: datetime.datetime | None
|
||||
is_netloc_banned: bool
|
||||
|
||||
@property
|
||||
def parsed_url(self) -> urllib.parse.SplitResult:
|
||||
if hasattr(self, '_parsed_url') is False:
|
||||
self._parsed_url = urllib.parse.urlsplit(self.url)
|
||||
|
||||
return self._parsed_url
|
||||
|
||||
@property
|
||||
def parsed_url_query(self) -> dict:
|
||||
if hasattr(self, '_parsed_url_query') is False:
|
||||
self._parsed_url_query = urllib.parse.parse_qs(
|
||||
self.parsed_url.query,
|
||||
)
|
||||
|
||||
return self._parsed_url_query
|
||||
|
||||
@property
|
||||
def netloc(self) -> str:
|
||||
return self.parsed_url.netloc
|
||||
|
||||
@property
|
||||
def is_youtube_video(self) -> bool:
|
||||
return any((
|
||||
all((
|
||||
self.netloc.endswith('youtube.com'),
|
||||
'v' in self.parsed_url_query,
|
||||
)),
|
||||
all((
|
||||
self.netloc.endswith('youtube.com'),
|
||||
self.parsed_url.path.startswith('/live'),
|
||||
)),
|
||||
self.netloc.endswith('youtu.be'),
|
||||
))
|
||||
|
||||
|
||||
class SaveIn(pydantic.BaseModel):
|
||||
url: str
|
||||
is_netloc_banned: bool | None = pydantic.Field(default=None)
|
||||
|
||||
|
||||
class ImportedSaveIn(SaveIn):
|
||||
title: str
|
||||
|
||||
|
||||
class SavesQuery(Query):
|
||||
pass
|
||||
Reference in New Issue
Block a user