Add QR codes, link expiry, password protection, previews, audit trail and bulk operations

This commit is contained in:
thakares committed 2026-06-12 19:57:53 +05:30
1 parent 157aa81252
commit bcbcc90d98
88 files changed
+5354 -815

No files matched your search

+1 -1
View File
@@ -1,4 +1,4 @@
use serde::{Serialize, Deserialize};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct ApiKey {
+1 -1
View File
@@ -1,4 +1,4 @@
use serde::{Serialize, Deserialize};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct AuditLog {
+8 -8
View File
@@ -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
View File
@@ -1,4 +1,4 @@
use serde::{Serialize, Deserialize};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct LandingPage {
+64 -1
View File
@@ -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
View File
@@ -1,4 +1,4 @@
use serde::{Serialize, Deserialize};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct User {
+1 -1
View File
@@ -1,4 +1,4 @@
use serde::{Serialize, Deserialize};
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Clone, Debug)]
pub struct VisitRecord {