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