Add QR codes, link expiry, password protection, previews, audit trail and bulk operations
This commit is contained in:
1 parent
157aa81252
commit
bcbcc90d98
88 files changed
+5354
-815
No files matched your search
@@ -1,4 +1,4 @@
|
||||
use serde::{Serialize, Deserialize};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct ApiKey {
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
use serde::{Serialize, Deserialize};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct AuditLog {
|
||||
|
||||
+8
-8
@@ -1,13 +1,13 @@
|
||||
pub mod user;
|
||||
pub mod url;
|
||||
pub mod page;
|
||||
pub mod visit;
|
||||
pub mod api_key;
|
||||
pub mod audit;
|
||||
pub mod page;
|
||||
pub mod url;
|
||||
pub mod user;
|
||||
pub mod visit;
|
||||
|
||||
pub use user::{User, Session};
|
||||
pub use url::Url;
|
||||
pub use page::LandingPage;
|
||||
pub use visit::{VisitRecord, SummaryEntry};
|
||||
pub use api_key::ApiKey;
|
||||
pub use audit::AuditLog;
|
||||
pub use page::LandingPage;
|
||||
pub use url::{AuditEvent, LinkPreview, QrCode, Url};
|
||||
pub use user::{Session, User};
|
||||
pub use visit::{SummaryEntry, VisitRecord};
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
use serde::{Serialize, Deserialize};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct LandingPage {
|
||||
|
||||
+64
-1
@@ -1,4 +1,4 @@
|
||||
use serde::{Serialize, Deserialize};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct Url {
|
||||
@@ -11,4 +11,67 @@ pub struct Url {
|
||||
pub created_at: String,
|
||||
pub updated_at: String,
|
||||
pub tags: Vec<String>,
|
||||
// --- Feature Expansion Fields ---
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub expires_at: Option<String>,
|
||||
#[serde(default)]
|
||||
pub expired: bool,
|
||||
#[serde(skip_serializing)]
|
||||
pub password_hash: Option<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub last_status: Option<String>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub last_latency_ms: Option<i64>,
|
||||
#[serde(skip_serializing_if = "Option::is_none")]
|
||||
pub max_access_count: Option<i64>,
|
||||
#[serde(default)]
|
||||
pub access_count: i64,
|
||||
}
|
||||
|
||||
impl Url {
|
||||
/// Returns true if this URL has a password set.
|
||||
pub fn is_password_protected(&self) -> bool {
|
||||
self.password_hash.is_some()
|
||||
}
|
||||
|
||||
/// Returns true if this URL has reached its access limit.
|
||||
pub fn is_access_exhausted(&self) -> bool {
|
||||
if let Some(max) = self.max_access_count {
|
||||
self.access_count >= max
|
||||
} else {
|
||||
false
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// Link preview metadata for smart landing pages.
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct LinkPreview {
|
||||
pub id: String,
|
||||
pub url_id: String,
|
||||
pub title: Option<String>,
|
||||
pub description: Option<String>,
|
||||
pub logo_url: Option<String>,
|
||||
pub button_text: String,
|
||||
}
|
||||
|
||||
/// QR code metadata record.
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct QrCode {
|
||||
pub id: String,
|
||||
pub url_id: String,
|
||||
pub style: String,
|
||||
pub created_at: String,
|
||||
}
|
||||
|
||||
/// Audit event record for the enhanced audit trail.
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct AuditEvent {
|
||||
pub id: String,
|
||||
pub actor: String,
|
||||
pub action: String,
|
||||
pub object_type: String,
|
||||
pub object_id: String,
|
||||
pub timestamp: String,
|
||||
pub metadata: Option<String>,
|
||||
}
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
use serde::{Serialize, Deserialize};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct User {
|
||||
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
use serde::{Serialize, Deserialize};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
#[derive(Serialize, Deserialize, Clone, Debug)]
|
||||
pub struct VisitRecord {
|
||||
|
||||
Reference in new issue
Block a user