1use crate::prelude::*;
4use cloudillo_types::meta_adapter::CreateRefOptions;
5use cloudillo_types::types::Timestamp;
6use cloudillo_types::utils;
7
8pub struct CreateRefInternalParams<'a> {
10 pub id_tag: &'a str,
12 pub typ: &'a str,
14 pub description: Option<&'a str>,
16 pub expires_at: Option<Timestamp>,
18 pub path_prefix: &'a str,
20 pub resource_id: Option<&'a str>,
22 pub count: Option<u32>,
24}
25
26pub async fn create_ref_internal(
40 app: &App,
41 tn_id: TnId,
42 params: CreateRefInternalParams<'_>,
43) -> ClResult<(String, String)> {
44 let ref_id = utils::random_id()?;
46
47 let ref_opts = CreateRefOptions {
49 typ: params.typ.to_string(),
50 description: params.description.map(|s| s.to_string()),
51 expires_at: params.expires_at,
52 count: Some(params.count.unwrap_or(1)),
53 resource_id: params.resource_id.map(|s| s.to_string()),
54 access_level: None,
55 };
56
57 app.meta_adapter.create_ref(tn_id, &ref_id, &ref_opts).await.map_err(|e| {
59 warn!(
60 error = %e,
61 tn_id = ?tn_id,
62 ref_id = %ref_id,
63 typ = %params.typ,
64 "Failed to create reference"
65 );
66 e
67 })?;
68
69 let url = format!("https://{}{}/{}", params.id_tag, params.path_prefix, ref_id);
71
72 info!(
73 tn_id = ?tn_id,
74 ref_id = %ref_id,
75 typ = %params.typ,
76 url = %url,
77 "Created reference successfully"
78 );
79
80 Ok((ref_id, url))
81}
82
83