11use askama:: Template ;
22use askama_web:: WebTemplate ;
3- use axum:: extract:: { Multipart , State } ;
4- use axum:: response:: { IntoResponse , Redirect } ;
3+ use axum:: extract:: { Form , State } ;
4+ use axum:: response:: { IntoResponse , Response } ;
55use hightorrent_api:: hightorrent:: MagnetLink ;
66use serde:: { Deserialize , Serialize } ;
7+ use snafu:: prelude:: * ;
78
9+ use crate :: database:: magnet:: { MagnetOperator , Model as Magnet } ;
810use crate :: extractors:: user:: User ;
911use crate :: routes:: index:: IndexTemplate ;
10- use crate :: state:: { AppState , AppStateContext , error:: AppStateError } ;
12+ use crate :: state:: { AppState , AppStateContext , error:: * } ;
1113
1214/// Multipart form submitted to /magnet/upload:
1315///
@@ -31,42 +33,44 @@ pub struct MagnetTemplate {
3133pub async fn upload (
3234 State ( app_state) : State < AppState > ,
3335 user : Option < User > ,
34- mut form : Multipart ,
35- ) -> Result < impl IntoResponse , AppStateError > {
36- let mut magnet: Option < String > = None ;
37-
38- while let Some ( field) = form. next_field ( ) . await . unwrap ( ) {
39- let name = field. name ( ) . unwrap ( ) . to_string ( ) ;
40- let data = field. text ( ) . await . unwrap ( ) ;
41-
42- if name == "magnet" && !data. is_empty ( ) {
43- magnet = Some ( data) ;
44- }
45- }
46-
47- if magnet. is_none ( ) {
48- // No magnet was submitted. This is not an error, simply display the form again
49- return Ok ( Redirect :: to ( "/" ) . into_response ( ) ) ;
50- }
51-
52- let magnet = magnet. unwrap ( ) ;
53-
36+ Form ( form) : Form < MagnetForm > ,
37+ ) -> Result < Response , AppStateError > {
5438 // Parse magnet
55- match MagnetLink :: new ( & magnet) {
56- Ok ( magnet) => Ok ( MagnetTemplate {
39+ let operator = MagnetOperator :: new ( app_state. clone ( ) , user. clone ( ) ) ;
40+
41+ match operator. create ( & form) . await . context ( MagnetUploadSnafu ) {
42+ Ok ( magnet_model) => Ok ( MagnetTemplate {
5743 state : app_state. context ( ) . await ?,
5844 user,
59- magnet,
45+ magnet : magnet_model . magnet ,
6046 }
6147 . into_response ( ) ) ,
62- Err ( e) => {
63- let form = MagnetForm { magnet } ;
64-
65- // TODO: typed error
66- Ok ( IndexTemplate :: new ( app_state, user)
67- . await ?
68- . with_errored_form ( form, e. to_string ( ) )
69- . into_response ( ) )
70- }
48+ Err ( e) => Ok ( IndexTemplate :: new ( app_state, user)
49+ . await ?
50+ . with_errored_form ( form, e)
51+ . into_response ( ) ) ,
7152 }
7253}
54+
55+ #[ derive( Template , WebTemplate ) ]
56+ #[ template( path = "magnet_list.html" ) ]
57+ pub struct MagnetListTemplate {
58+ /// Global application state (errors/warnings)
59+ pub state : AppStateContext ,
60+ /// Logged-in user.
61+ pub user : Option < User > ,
62+ /// Magnets stored in database
63+ pub magnets : Vec < Magnet > ,
64+ }
65+
66+ // pub async fn list(
67+ // State(app_state): State<AppState>,
68+ // user: Option<User>
69+ // ) -> Result<impl IntoResponse, AppStateError> {
70+
71+ // Ok(MagnetTemplate {
72+ // state: app_state.context().await?,
73+ // user,
74+ // magnet,
75+ // })
76+ // }
0 commit comments