Skip to content
This repository was archived by the owner on Sep 2, 2021. It is now read-only.

Commit 2c6621f

Browse files
committed
Support media api, do some refactor and add API as unimplemented.
1 parent 8eda5e5 commit 2c6621f

File tree

5 files changed

+174
-72
lines changed

5 files changed

+174
-72
lines changed

src/api/r0/content.rs

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
//! Endpoints for content.
2+
use iron::{Chain, Handler, IronError, IronResult, Request, Response};
3+
4+
use error::ApiError;
5+
use middleware::{AccessTokenAuth, MiddlewareChain};
6+
7+
/// The `/upload` endpoint.
8+
pub struct Upload;
9+
10+
middleware_chain!(Upload, [AccessTokenAuth]);
11+
12+
impl Handler for Upload {
13+
fn handle(&self, _: &mut Request) -> IronResult<Response> {
14+
Err(IronError::from(ApiError::unimplemented(None)))
15+
}
16+
}
17+
18+
/// The `/download/:server_name/:media_id` endpoint.
19+
pub struct Download;
20+
21+
middleware_chain!(Download, [AccessTokenAuth]);
22+
23+
impl Handler for Download {
24+
fn handle(&self, _: &mut Request) -> IronResult<Response> {
25+
Err(IronError::from(ApiError::unimplemented(None)))
26+
}
27+
}
28+
29+
/// The `/download/:server_name/:media_id/:file_name` endpoint.
30+
pub struct DownloadFile;
31+
32+
middleware_chain!(DownloadFile, [AccessTokenAuth]);
33+
34+
impl Handler for DownloadFile {
35+
fn handle(&self, _: &mut Request) -> IronResult<Response> {
36+
Err(IronError::from(ApiError::unimplemented(None)))
37+
}
38+
}

src/api/r0/mod.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,23 +6,27 @@ pub use self::account::{
66
PutAccountData,
77
PutRoomAccountData,
88
};
9+
pub use self::content::{Download, DownloadFile, Upload};
910
pub use self::directory::{GetRoomAlias, DeleteRoomAlias, PutRoomAlias};
1011
pub use self::event_creation::{SendMessageEvent, StateMessageEvent};
1112
pub use self::join::{InviteToRoom, JoinRoom, JoinRoomWithIdOrAlias, KickFromRoom, LeaveRoom};
1213
pub use self::login::Login;
1314
pub use self::logout::Logout;
1415
pub use self::members::Members;
1516
pub use self::presence::{GetPresenceList, GetPresenceStatus, PostPresenceList, PutPresenceStatus};
17+
pub use self::preview_url::PreviewUrl;
1618
pub use self::profile::{Profile, GetAvatarUrl, PutAvatarUrl, GetDisplayName, PutDisplayName};
1719
pub use self::registration::Register;
1820
pub use self::room_creation::CreateRoom;
1921
pub use self::room_info::RoomState;
20-
pub use self::tags::{DeleteTag, GetTags, PutTag};
2122
pub use self::sync::Sync;
23+
pub use self::tags::{DeleteTag, GetTags, PutTag};
24+
pub use self::thumbnail::Thumbnail;
2225
pub use self::versions::Versions;
2326
pub use self::filter::{GetFilter, PostFilter};
2427

2528
mod account;
29+
mod content;
2630
mod directory;
2731
mod event_creation;
2832
mod filter;
@@ -31,10 +35,12 @@ mod login;
3135
mod logout;
3236
mod members;
3337
mod presence;
38+
mod preview_url;
3439
mod profile;
3540
mod registration;
3641
mod room_creation;
3742
mod room_info;
38-
mod tags;
3943
mod sync;
44+
mod tags;
45+
mod thumbnail;
4046
mod versions;

src/api/r0/preview_url.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//! Endpoints for content.
2+
use iron::{Chain, Handler, IronError, IronResult, Request, Response};
3+
4+
use error::ApiError;
5+
use middleware::{AccessTokenAuth, MiddlewareChain};
6+
7+
/// The `/preview_url` endpoint.
8+
pub struct PreviewUrl;
9+
10+
middleware_chain!(PreviewUrl, [AccessTokenAuth]);
11+
12+
impl Handler for PreviewUrl {
13+
fn handle(&self, _: &mut Request) -> IronResult<Response> {
14+
Err(IronError::from(ApiError::unimplemented(None)))
15+
}
16+
}

src/api/r0/thumbnail.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
//! Endpoints for content.
2+
use iron::{Chain, Handler, IronError, IronResult, Request, Response};
3+
4+
use error::ApiError;
5+
use middleware::{AccessTokenAuth, MiddlewareChain};
6+
7+
/// The `/thumbnail/:server_name/:media_id` endpoint.
8+
pub struct Thumbnail;
9+
10+
middleware_chain!(Thumbnail, [AccessTokenAuth]);
11+
12+
impl Handler for Thumbnail {
13+
fn handle(&self, _: &mut Request) -> IronResult<Response> {
14+
Err(IronError::from(ApiError::unimplemented(None)))
15+
}
16+
}

src/server.rs

Lines changed: 96 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,8 @@ use api::r0::{
1515
DeactivateAccount,
1616
DeleteRoomAlias,
1717
DeleteTag,
18+
Download,
19+
DownloadFile,
1820
GetAvatarUrl,
1921
GetDisplayName,
2022
GetFilter,
@@ -32,6 +34,7 @@ use api::r0::{
3234
Members,
3335
PostFilter,
3436
PostPresenceList,
37+
PreviewUrl,
3538
Profile,
3639
PutAccountData,
3740
PutAvatarUrl,
@@ -45,6 +48,8 @@ use api::r0::{
4548
SendMessageEvent,
4649
StateMessageEvent,
4750
Sync,
51+
Thumbnail,
52+
Upload,
4853
Versions,
4954
};
5055
use config::Config;
@@ -74,101 +79,122 @@ impl<'a> Server<'a> {
7479
r2d2_config: R2D2Config<PgConnection, R2D2DieselError>,
7580
set_up_db: bool,
7681
) -> Result<Server, CliError> {
77-
let mut r0_router = Router::new();
82+
debug!("Connecting to PostgreSQL.");
83+
let connection_pool = DB::create_connection_pool(r2d2_config, &ruma_config.postgres_url)?;
84+
let connection = connection_pool.get()?;
85+
86+
if set_up_db {
87+
debug!("Setting up database.");
88+
setup_database(&*connection).map_err(CliError::from)?;
89+
90+
debug!("Running pending database migrations.");
91+
run_pending_migrations(&*connection).map_err(CliError::from)?;
92+
}
93+
94+
let mut mount = Mount::new();
95+
96+
97+
/// Add version endpoint
98+
let mut versions_router = Router::new();
99+
100+
versions_router.get("/versions", Versions::supported(), "versions");
101+
102+
let mut versions = Chain::new(versions_router);
103+
versions.link_after(ResponseHeaders);
104+
105+
mount.mount("/_matrix/client/", versions);
106+
107+
108+
/// Add client endpoint
109+
let mut r0_client_router = Router::new();
78110

79-
r0_router.post("/account/password", AccountPassword::chain(), "account_password");
80-
r0_router.post("/account/deactivate", DeactivateAccount::chain(), "deactivate_account");
81-
r0_router.post("/createRoom", CreateRoom::chain(), "create_room");
82-
r0_router.get("/directory/room/:room_alias", GetRoomAlias::chain(), "get_room_alias");
83-
r0_router.delete(
111+
r0_client_router.post("/account/password", AccountPassword::chain(), "account_password");
112+
r0_client_router.post("/account/deactivate", DeactivateAccount::chain(), "deactivate_account");
113+
r0_client_router.post("/createRoom", CreateRoom::chain(), "create_room");
114+
r0_client_router.get("/directory/room/:room_alias", GetRoomAlias::chain(), "get_room_alias");
115+
r0_client_router.delete(
84116
"/directory/room/:room_alias",
85117
DeleteRoomAlias::chain(),
86118
"delete_room_alias",
87119
);
88-
r0_router.put("/directory/room/:room_alias", PutRoomAlias::chain(), "put_room_alias");
89-
r0_router.post("/login", Login::chain(), "login");
90-
r0_router.post("/logout", Logout::chain(), "logout");
91-
r0_router.post("/register", Register::chain(), "register");
92-
r0_router.post("/tokenrefresh", deprecated, "token_refresh");
93-
r0_router.put(
120+
r0_client_router.put("/directory/room/:room_alias", PutRoomAlias::chain(), "put_room_alias");
121+
r0_client_router.post("/login", Login::chain(), "login");
122+
r0_client_router.post("/logout", Logout::chain(), "logout");
123+
r0_client_router.post("/register", Register::chain(), "register");
124+
r0_client_router.post("/tokenrefresh", deprecated, "token_refresh");
125+
r0_client_router.put(
94126
"/user/:user_id/account_data/:type",
95127
PutAccountData::chain(),
96128
"put_account_data",
97129
);
98-
r0_router.put(
130+
r0_client_router.put(
99131
"/user/:user_id/rooms/:room_id/account_data/:type",
100132
PutRoomAccountData::chain(),
101133
"put_room_account_data",
102134
);
103-
r0_router.put(
135+
r0_client_router.put(
104136
"/rooms/:room_id/send/:event_type/:transaction_id",
105137
SendMessageEvent::chain(),
106138
"send_message_event",
107139
);
108-
r0_router.put(
140+
r0_client_router.put(
109141
"/rooms/:room_id/state/:event_type",
110142
StateMessageEvent::chain(),
111143
"state_message_event",
112144
);
113-
r0_router.put(
145+
r0_client_router.put(
114146
"/rooms/:room_id/state/:event_type/:state_key",
115147
StateMessageEvent::chain(),
116148
"state_message_event_with_key",
117149
);
118-
119-
/// Joining rooms
120-
r0_router.post("/rooms/:room_id/join", JoinRoom::chain(), "join_room");
121-
r0_router.post("/rooms/:room_id/invite", InviteToRoom::chain(), "invite_to_room");
122-
r0_router.post("/join/:room_id_or_alias", JoinRoomWithIdOrAlias::chain(), "join_room_with_alias");
123-
r0_router.post("rooms/:room_id/kick", KickFromRoom::chain(), "kick_from_room");
124-
r0_router.post("rooms/:room_id/leave", LeaveRoom::chain(), "leave_room");
125-
r0_router.get("/rooms/:room_id/members", Members::chain(), "members");
126-
r0_router.get("/rooms/:room_id/state", RoomState::chain(), "get_room_state");
127-
r0_router.get("/profile/:user_id", Profile::chain(), "profile");
128-
r0_router.get("/profile/:user_id/avatar_url", GetAvatarUrl::chain(), "get_avatar_url");
129-
r0_router.get("/profile/:user_id/displayname", GetDisplayName::chain(), "get_display_name");
130-
r0_router.put("/profile/:user_id/avatar_url", PutAvatarUrl::chain(), "put_avatar_url");
131-
r0_router.put("/profile/:user_id/displayname", PutDisplayName::chain(), "put_display_name");
132-
r0_router.get("/user/:user_id/rooms/:room_id/tags", GetTags::chain(), "get_tags");
133-
r0_router.put("/user/:user_id/rooms/:room_id/tags/:tag", PutTag::chain(), "add_tag");
134-
r0_router.delete("/user/:user_id/rooms/:room_id/tags/:tag", DeleteTag::chain(), "delete_tag");
135-
r0_router.get("/user/:user_id/filter/:filter_id", GetFilter::chain(), "get_filter");
136-
r0_router.post("/user/:user_id/filter", PostFilter::chain(), "post_filter");
137-
r0_router.get("/sync", Sync::chain(), "sync");
138-
r0_router.get("/presence/:user_id/status", GetPresenceStatus::chain(), "get_presence_status");
139-
r0_router.put("/presence/:user_id/status", PutPresenceStatus::chain(), "put_presence_status");
140-
r0_router.get("/presence/list/:user_id", GetPresenceList::chain(), "get_presence_list");
141-
r0_router.post("/presence/list/:user_id", PostPresenceList::chain(), "post_presence_list");
142-
143-
let mut r0 = Chain::new(r0_router);
144-
145-
debug!("Connecting to PostgreSQL.");
146-
let connection_pool = DB::create_connection_pool(r2d2_config, &ruma_config.postgres_url)?;
147-
let connection = connection_pool.get()?;
148-
149-
if set_up_db {
150-
debug!("Setting up database.");
151-
setup_database(&*connection).map_err(CliError::from)?;
152-
153-
debug!("Running pending database migrations.");
154-
run_pending_migrations(&*connection).map_err(CliError::from)?;
155-
}
156-
157-
r0.link_before(Read::<Config>::one(ruma_config.clone()));
158-
r0.link_before(Write::<DB>::one(connection_pool));
159-
r0.link_after(ResponseHeaders);
160-
161-
let mut versions_router = Router::new();
162-
163-
versions_router.get("/versions", Versions::supported(), "versions");
164-
165-
let mut versions = Chain::new(versions_router);
166-
versions.link_after(ResponseHeaders);
167-
168-
let mut mount = Mount::new();
169-
170-
mount.mount("/_matrix/client/", versions);
171-
mount.mount("/_matrix/client/r0/", r0);
150+
r0_client_router.post("/rooms/:room_id/join", JoinRoom::chain(), "join_room");
151+
r0_client_router.post("/rooms/:room_id/invite", InviteToRoom::chain(), "invite_to_room");
152+
r0_client_router.post("/join/:room_id_or_alias", JoinRoomWithIdOrAlias::chain(), "join_room_with_alias");
153+
r0_client_router.post("rooms/:room_id/kick", KickFromRoom::chain(), "kick_from_room");
154+
r0_client_router.post("rooms/:room_id/leave", LeaveRoom::chain(), "leave_room");
155+
r0_client_router.get("/rooms/:room_id/members", Members::chain(), "members");
156+
r0_client_router.get("/rooms/:room_id/state", RoomState::chain(), "get_room_state");
157+
r0_client_router.get("/profile/:user_id", Profile::chain(), "profile");
158+
r0_client_router.get("/profile/:user_id/avatar_url", GetAvatarUrl::chain(), "get_avatar_url");
159+
r0_client_router.get("/profile/:user_id/displayname", GetDisplayName::chain(), "get_display_name");
160+
r0_client_router.put("/profile/:user_id/avatar_url", PutAvatarUrl::chain(), "put_avatar_url");
161+
r0_client_router.put("/profile/:user_id/displayname", PutDisplayName::chain(), "put_display_name");
162+
r0_client_router.get("/user/:user_id/rooms/:room_id/tags", GetTags::chain(), "get_tags");
163+
r0_client_router.put("/user/:user_id/rooms/:room_id/tags/:tag", PutTag::chain(), "add_tag");
164+
r0_client_router.delete("/user/:user_id/rooms/:room_id/tags/:tag", DeleteTag::chain(), "delete_tag");
165+
r0_client_router.get("/user/:user_id/filter/:filter_id", GetFilter::chain(), "get_filter");
166+
r0_client_router.post("/user/:user_id/filter", PostFilter::chain(), "post_filter");
167+
r0_client_router.get("/sync", Sync::chain(), "sync");
168+
r0_client_router.get("/presence/:user_id/status", GetPresenceStatus::chain(), "get_presence_status");
169+
r0_client_router.put("/presence/:user_id/status", PutPresenceStatus::chain(), "put_presence_status");
170+
r0_client_router.get("/presence/list/:user_id", GetPresenceList::chain(), "get_presence_list");
171+
r0_client_router.post("/presence/list/:user_id", PostPresenceList::chain(), "post_presence_list");
172+
173+
let mut r0_client = Chain::new(r0_client_router);
174+
175+
r0_client.link_before(Read::<Config>::one(ruma_config.clone()));
176+
r0_client.link_before(Write::<DB>::one(connection_pool.clone()));
177+
r0_client.link_after(ResponseHeaders);
178+
179+
mount.mount("/_matrix/client/r0/", r0_client);
180+
181+
182+
/// Add media endpoint
183+
let mut r0_media_router = Router::new();
184+
185+
r0_media_router.get("/download/:server_name/:media_id", Download::chain(), "download");
186+
r0_media_router.get("/download/:server_name/:media_id/:file_name", DownloadFile::chain(), "download_file_name");
187+
r0_media_router.get("/thumbnail/:server_name/:media_id", Thumbnail::chain(), "thumbnail");
188+
r0_media_router.post("/upload", Upload::chain(), "upload");
189+
r0_media_router.post("/preview_url", PreviewUrl::chain(), "preview_url");
190+
191+
let mut r0_media = Chain::new(r0_media_router);
192+
193+
r0_media.link_before(Read::<Config>::one(ruma_config.clone()));
194+
r0_media.link_before(Write::<DB>::one(connection_pool));
195+
r0_media.link_after(ResponseHeaders);
196+
197+
mount.mount("/_matrix/media/r0/", r0_media);
172198

173199
mount_swagger(&mut mount);
174200

0 commit comments

Comments
 (0)