Add API method for generating post previews
https://codeberg.org/silverpill/mitra/issues/12
This commit is contained in:
parent
f7d9173cce
commit
a23a555a05
|
@ -710,9 +710,7 @@ paths:
|
||||||
type: object
|
type: object
|
||||||
properties:
|
properties:
|
||||||
status:
|
status:
|
||||||
description: |
|
description: Text content of the post.
|
||||||
Text content of the post.
|
|
||||||
Allowed HTML tags: a, br, pre, code, strong, em, p.
|
|
||||||
type: string
|
type: string
|
||||||
content_type:
|
content_type:
|
||||||
description: Media type of the post content.
|
description: Media type of the post content.
|
||||||
|
@ -751,6 +749,42 @@ paths:
|
||||||
$ref: '#/components/schemas/Status'
|
$ref: '#/components/schemas/Status'
|
||||||
400:
|
400:
|
||||||
description: Invalid post data
|
description: Invalid post data
|
||||||
|
/api/v1/statuses/preview:
|
||||||
|
post:
|
||||||
|
summary: Preview new post.
|
||||||
|
security:
|
||||||
|
- tokenAuth: []
|
||||||
|
requestBody:
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
status:
|
||||||
|
description: Text content of the post.
|
||||||
|
type: string
|
||||||
|
content_type:
|
||||||
|
description: Media type of the post content.
|
||||||
|
type: string
|
||||||
|
default: text/html
|
||||||
|
enum:
|
||||||
|
- text/html
|
||||||
|
- text/markdown
|
||||||
|
required:
|
||||||
|
- status
|
||||||
|
responses:
|
||||||
|
200:
|
||||||
|
description: Preview generated.
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
content:
|
||||||
|
description: HTML-encoded post content.
|
||||||
|
type: string
|
||||||
|
400:
|
||||||
|
description: Invalid post data.
|
||||||
/api/v1/statuses/{status_id}:
|
/api/v1/statuses/{status_id}:
|
||||||
delete:
|
delete:
|
||||||
summary: Delete post
|
summary: Delete post
|
||||||
|
|
|
@ -149,6 +149,19 @@ pub struct StatusData {
|
||||||
pub content_type: String,
|
pub content_type: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct StatusPreviewData {
|
||||||
|
pub status: String,
|
||||||
|
|
||||||
|
#[serde(default = "default_post_content_type")]
|
||||||
|
pub content_type: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize)]
|
||||||
|
pub struct StatusPreview {
|
||||||
|
pub content: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Deserialize)]
|
#[derive(Deserialize)]
|
||||||
pub struct TransactionData {
|
pub struct TransactionData {
|
||||||
pub transaction_id: String,
|
pub transaction_id: String,
|
||||||
|
|
|
@ -47,7 +47,13 @@ use super::helpers::{
|
||||||
parse_microsyntaxes,
|
parse_microsyntaxes,
|
||||||
PostContent,
|
PostContent,
|
||||||
};
|
};
|
||||||
use super::types::{Status, StatusData, TransactionData};
|
use super::types::{
|
||||||
|
Status,
|
||||||
|
StatusData,
|
||||||
|
StatusPreview,
|
||||||
|
StatusPreviewData,
|
||||||
|
TransactionData,
|
||||||
|
};
|
||||||
|
|
||||||
#[post("")]
|
#[post("")]
|
||||||
async fn create_status(
|
async fn create_status(
|
||||||
|
@ -161,6 +167,36 @@ async fn create_status(
|
||||||
Ok(HttpResponse::Created().json(status))
|
Ok(HttpResponse::Created().json(status))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[post("/preview")]
|
||||||
|
async fn preview_status(
|
||||||
|
auth: BearerAuth,
|
||||||
|
config: web::Data<Config>,
|
||||||
|
db_pool: web::Data<DbPool>,
|
||||||
|
status_data: web::Json<StatusPreviewData>,
|
||||||
|
) -> Result<HttpResponse, HttpError> {
|
||||||
|
let db_client = &**get_database_client(&db_pool).await?;
|
||||||
|
get_current_user(db_client, auth.token()).await?;
|
||||||
|
let status_data = status_data.into_inner();
|
||||||
|
let content = match status_data.content_type.as_str() {
|
||||||
|
"text/html" => status_data.status,
|
||||||
|
"text/markdown" => {
|
||||||
|
markdown_lite_to_html(&status_data.status)
|
||||||
|
.map_err(|_| ValidationError("invalid markdown"))?
|
||||||
|
},
|
||||||
|
_ => return Err(ValidationError("unsupported content type").into()),
|
||||||
|
};
|
||||||
|
let PostContent { mut content, .. } = parse_microsyntaxes(
|
||||||
|
db_client,
|
||||||
|
&config.instance(),
|
||||||
|
content,
|
||||||
|
).await?;
|
||||||
|
// Clean content
|
||||||
|
content = clean_content(&content)?;
|
||||||
|
// Return preview
|
||||||
|
let preview = StatusPreview { content };
|
||||||
|
Ok(HttpResponse::Ok().json(preview))
|
||||||
|
}
|
||||||
|
|
||||||
#[get("/{status_id}")]
|
#[get("/{status_id}")]
|
||||||
async fn get_status(
|
async fn get_status(
|
||||||
auth: Option<BearerAuth>,
|
auth: Option<BearerAuth>,
|
||||||
|
@ -524,6 +560,7 @@ pub fn status_api_scope() -> Scope {
|
||||||
web::scope("/api/v1/statuses")
|
web::scope("/api/v1/statuses")
|
||||||
// Routes without status ID
|
// Routes without status ID
|
||||||
.service(create_status)
|
.service(create_status)
|
||||||
|
.service(preview_status)
|
||||||
// Routes with status ID
|
// Routes with status ID
|
||||||
.service(get_status)
|
.service(get_status)
|
||||||
.service(delete_status)
|
.service(delete_status)
|
||||||
|
|
Loading…
Reference in a new issue