Skip to content

Commit b656661

Browse files
Add upload_file method
1 parent d06bde2 commit b656661

File tree

6 files changed

+84
-4
lines changed

6 files changed

+84
-4
lines changed

solapi/error/MessageNotReceiveError.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
class MessageNotReceivedError(Exception):
55
def __init__(self, failed_messages: list[FailedMessage]):
66
self.failed_messages = failed_messages
7-
7+
88
def __str__(self):
99
# TODO: i18n needed
10-
return "메시지 접수에 실패했습니다.\n자세한 내용은 MessageNotReceivedError의 failed_messages 프로퍼티를 참조해주세요."
10+
return "메시지 접수에 실패했습니다.\n자세한 내용은 MessageNotReceivedError의 failed_messages 프로퍼티를 참조해 주세요."

solapi/message_service.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import base64
12
from datetime import datetime
3+
from pathlib import Path
24
from typing import Optional, Union
35

46
from solapi.error.MessageNotReceiveError import MessageNotReceivedError
@@ -10,7 +12,9 @@
1012
SendMessageRequest,
1113
SendRequestConfig,
1214
)
15+
from solapi.model.request.storage import FileTypeEnum, FileUploadRequest
1316
from solapi.model.response.send_message_response import SendMessageResponse
17+
from solapi.model.response.storage import FileUploadResponse
1418

1519

1620
class SolapiMessageService:
@@ -77,3 +81,27 @@ def send(
7781
raise MessageNotReceivedError(failed_messages) from ValueError
7882

7983
return deserialized_response
84+
85+
def upload_file(
86+
self, file_path: str, upload_type: FileTypeEnum = FileTypeEnum.MMS
87+
) -> FileUploadResponse:
88+
path = Path(file_path)
89+
with open(path, "rb") as image_file:
90+
encoded_string = base64.b64encode(image_file.read())
91+
92+
request = FileUploadRequest(
93+
file=str(encoded_string)[2:-1],
94+
type=upload_type,
95+
).model_dump(exclude_none=True)
96+
response = default_fetcher(
97+
self.auth_info,
98+
request={
99+
"url": f"{self.base_url}/storage/v1/files",
100+
"method": RequestMethod.POST,
101+
},
102+
data=request,
103+
)
104+
deserialized_response: FileUploadResponse = FileUploadResponse.model_validate(
105+
response
106+
)
107+
return deserialized_response

solapi/model/message.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,7 @@ class Message(BaseModel):
100100
)
101101

102102
model_config = ConfigDict(
103-
extra="ignore", populate_by_name=True, alias_generator=to_camel
103+
extra="ignore",
104+
populate_by_name=True,
105+
alias_generator=to_camel,
104106
)

solapi/model/request/storage.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from enum import Enum
2+
from typing import Optional
3+
4+
from pydantic import BaseModel
5+
6+
7+
class FileTypeEnum(str, Enum):
8+
MMS = "MMS"
9+
KAKAO = "KAKAO"
10+
RCS = "RCS"
11+
FAX = "FAX"
12+
13+
14+
class FileUploadRequest(BaseModel):
15+
type: FileTypeEnum
16+
file: str
17+
name: Optional[str] = None
18+
link: Optional[str] = None

solapi/model/response/send_message_response.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@ class MessageItem(BaseModel):
1414

1515
model_config = ConfigDict(alias_generator=to_camel, populate_by_name=True)
1616

17+
1718
class FailedMessage(BaseModel):
1819
to: Optional[str]
19-
from_: Optional[str] = Field(..., serialization_alias="from", validation_alias="from")
20+
from_: Optional[str] = Field(
21+
..., serialization_alias="from", validation_alias="from"
22+
)
2023
type: str
2124
status_message: str = Field(..., alias="statusMessage")
2225
country: Optional[str]

solapi/model/response/storage.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
from datetime import datetime
2+
from typing import Optional
3+
4+
from pydantic import BaseModel, ConfigDict
5+
from pydantic.alias_generators import to_camel
6+
7+
8+
class KakaoFileUploadResponseProperty(BaseModel):
9+
daou: Optional[str] = None
10+
biztalk: Optional[str] = None
11+
12+
13+
class FileUploadResponse(BaseModel):
14+
kakao: Optional[KakaoFileUploadResponseProperty] = None
15+
type: str
16+
original_name: str
17+
link: Optional[str] = None
18+
file_id: str
19+
name: str
20+
url: str
21+
account_id: str
22+
references: Optional[list[str]] = None
23+
date_created: Optional[datetime] = None
24+
date_updated: Optional[datetime] = None
25+
26+
model_config = ConfigDict(
27+
alias_generator=to_camel,
28+
populate_by_name=True,
29+
)

0 commit comments

Comments
 (0)