@@ -95,7 +95,62 @@ void Files::ListFiles(const HttpRequestPtr& req,
9595
9696void Files::RetrieveFile (const HttpRequestPtr& req,
9797 std::function<void (const HttpResponsePtr&)>&& callback,
98- const std::string& file_id) const {
98+ const std::string& file_id,
99+ std::optional<std::string> thread_id) const {
100+ // this code part is for backward compatible. remove it later on
101+ if (thread_id.has_value ()) {
102+ auto msg_res =
103+ message_service_->RetrieveMessage (thread_id.value (), file_id);
104+ if (msg_res.has_error ()) {
105+ Json::Value ret;
106+ ret[" message" ] = msg_res.error ();
107+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
108+ resp->setStatusCode (k400BadRequest);
109+ callback (resp);
110+ return ;
111+ }
112+
113+ if (msg_res->attachments ->empty ()) {
114+ auto res = file_service_->RetrieveFile (file_id);
115+ if (res.has_error ()) {
116+ Json::Value ret;
117+ ret[" message" ] = res.error ();
118+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
119+ resp->setStatusCode (k400BadRequest);
120+ callback (resp);
121+ return ;
122+ }
123+
124+ auto resp =
125+ cortex_utils::CreateCortexHttpJsonResponse (res->ToJson ().value ());
126+ resp->setStatusCode (k200OK);
127+ callback (resp);
128+ return ;
129+ } else {
130+ if (!msg_res->attach_filename .has_value () || !msg_res->size .has_value ()) {
131+ Json::Value ret;
132+ ret[" message" ] = " File not found or had been removed!" ;
133+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
134+ resp->setStatusCode (k404NotFound);
135+ callback (resp);
136+ return ;
137+ }
138+
139+ Json::Value ret;
140+ ret[" object" ] = " file" ;
141+ ret[" created_at" ] = msg_res->created_at ;
142+ ret[" filename" ] = msg_res->attach_filename .value ();
143+ ret[" bytes" ] = msg_res->size .value ();
144+ ret[" id" ] = msg_res->id ;
145+ ret[" purpose" ] = " assistants" ;
146+
147+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
148+ resp->setStatusCode (k200OK);
149+ callback (resp);
150+ return ;
151+ }
152+ }
153+
99154 auto res = file_service_->RetrieveFile (file_id);
100155 if (res.has_error ()) {
101156 Json::Value ret;
@@ -137,7 +192,65 @@ void Files::DeleteFile(const HttpRequestPtr& req,
137192void Files::RetrieveFileContent (
138193 const HttpRequestPtr& req,
139194 std::function<void (const HttpResponsePtr&)>&& callback,
140- const std::string& file_id) {
195+ const std::string& file_id, std::optional<std::string> thread_id) {
196+ if (thread_id.has_value ()) {
197+ auto msg_res =
198+ message_service_->RetrieveMessage (thread_id.value (), file_id);
199+ if (msg_res.has_error ()) {
200+ Json::Value ret;
201+ ret[" message" ] = msg_res.error ();
202+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
203+ resp->setStatusCode (k400BadRequest);
204+ callback (resp);
205+ return ;
206+ }
207+
208+ if (msg_res->attachments ->empty ()) {
209+ auto res = file_service_->RetrieveFileContent (file_id);
210+ if (res.has_error ()) {
211+ Json::Value ret;
212+ ret[" message" ] = res.error ();
213+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
214+ resp->setStatusCode (k400BadRequest);
215+ callback (resp);
216+ return ;
217+ }
218+
219+ auto [buffer, size] = std::move (res.value ());
220+ auto resp = HttpResponse::newHttpResponse ();
221+ resp->setBody (std::string (buffer.get (), size));
222+ resp->setContentTypeCode (CT_APPLICATION_OCTET_STREAM);
223+ callback (resp);
224+ } else {
225+ if (!msg_res->rel_path .has_value ()) {
226+ Json::Value ret;
227+ ret[" message" ] = " File not found or had been removed" ;
228+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
229+ resp->setStatusCode (k400BadRequest);
230+ callback (resp);
231+ return ;
232+ }
233+
234+ auto content_res =
235+ file_service_->RetrieveFileContentByPath (msg_res->rel_path .value ());
236+
237+ if (content_res.has_error ()) {
238+ Json::Value ret;
239+ ret[" message" ] = content_res.error ();
240+ auto resp = cortex_utils::CreateCortexHttpJsonResponse (ret);
241+ resp->setStatusCode (k400BadRequest);
242+ callback (resp);
243+ return ;
244+ }
245+
246+ auto [buffer, size] = std::move (content_res.value ());
247+ auto resp = HttpResponse::newHttpResponse ();
248+ resp->setBody (std::string (buffer.get (), size));
249+ resp->setContentTypeCode (CT_APPLICATION_OCTET_STREAM);
250+ callback (resp);
251+ }
252+ }
253+
141254 auto res = file_service_->RetrieveFileContent (file_id);
142255 if (res.has_error ()) {
143256 Json::Value ret;
0 commit comments