38409-vm/backend/src/db/seeders/20231127130745-sample-data.js
2026-02-13 17:35:49 +00:00

2654 lines
50 KiB
JavaScript

const db = require('../models');
const Users = db.users;
const CaseFiles = db.case_files;
const Wallets = db.wallets;
const TimelineEvents = db.timeline_events;
const CaseArtifacts = db.case_artifacts;
const RecoveryAnalyses = db.recovery_analyses;
const Tags = db.tags;
const RelatedCases = db.related_cases;
const CaseFilesData = [
{
"title": "The Landfill Millionaire Dossier",
"slug": "landfill-millionaire-dossier",
"status": "review",
"tone": "hopeful",
"format": "investigative_report",
"narrator_role": "quantum_cryptographer",
"loss_mechanism": "exchange_custody_failure",
"hook_sentence": "A fortune survived every hack but not a household cleanup.",
"summary": "A reconstruction of a discarded drive event and the years of salvage proposals that followed.",
"body_content": "Case narrative covering technical factors, human decisions, and market impact for a well known landfill loss scenario.",
"math_section": "Entropy was not the problem; key material was sealed behind physical destruction and time, shifting the difficulty from cryptography to archaeology.",
"aftermath_section": "Permits, environmental concerns, and evolving estimates defined the post loss decade.",
"now_section": "Community monitoring continues via known addresses and public statements; recovery remains unconfirmed.",
"horizon_section": "Future vectors include advanced forensic recovery and controlled excavation; probability remains low.",
"is_featured": true,
"published_at": new Date('2025-11-20T12:00:00Z'),
"incident_at": new Date('2013-08-10T00:00:00Z'),
"last_verified_at": new Date('2026-01-30T00:00:00Z'),
// type code here for "images" field
// type code here for "files" field
// type code here for "relation_one" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
},
{
"title": "The Password Puzzle Case File",
"slug": "password-puzzle-case-file",
"status": "archived",
"tone": "absurdist",
"format": "human_interest_feature",
"narrator_role": "true_crime_investigator",
"loss_mechanism": "hardware_lockout",
"hook_sentence": "The key exists, the lock holds, and time is the only attacker.",
"summary": "A technical and human factors review of a hardware wallet lockout with limited remaining attempts.",
"body_content": "Explains password attempt counters, threat models, and realistic recovery services and constraints.",
"math_section": "Brute force feasibility is bounded by attempt limits and device security rather than hash rate.",
"aftermath_section": "Legal and contractual considerations around custody and recovery service engagement.",
"now_section": "Ongoing status tracked by periodic statements and on chain inactivity evidence.",
"horizon_section": "Non invasive extraction research and future compute advances remain speculative.",
"is_featured": true,
"published_at": new Date('2025-10-04T09:00:00Z'),
"incident_at": new Date('2011-07-15T00:00:00Z'),
"last_verified_at": new Date('2026-02-01T00:00:00Z'),
// type code here for "images" field
// type code here for "files" field
// type code here for "relation_one" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
},
{
"title": "The Ghost Exchange Ledger",
"slug": "ghost-exchange-ledger",
"status": "draft",
"tone": "absurdist",
"format": "fictional_short_story",
"narrator_role": "blockchain_archaeologist",
"loss_mechanism": "accidental_destruction",
"hook_sentence": "A company vanished, yet the ledger kept perfect memories.",
"summary": "Custodial risk analysis of an exchange collapse and the long tail of claims and investigations.",
"body_content": "Chronology of custody practices, corporate governance gaps, and user impact with quantification.",
"math_section": "Transparency limits when keys are centralized and records are partial.",
"aftermath_section": "Receivership actions, claimant processes, and scam waves targeting victims.",
"now_section": "Case status updated as distributions and court milestones occur.",
"horizon_section": "Probability tied to asset tracing outcomes rather than cryptographic breakthroughs.",
"is_featured": true,
"published_at": new Date('2025-08-18T16:30:00Z'),
"incident_at": new Date('2018-12-09T00:00:00Z'),
"last_verified_at": new Date('2026-01-20T00:00:00Z'),
// type code here for "images" field
// type code here for "files" field
// type code here for "relation_one" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
// type code here for "relation_many" field
},
];
const WalletsData = [
{
// type code here for "relation_one" field
"chain": "dogecoin",
"wallet_type": "unknown",
"label": "Newport Drive Wallet",
"address": "1HowellsX8KDump9u2wQx3pP7mZxYk2s",
"xpub_or_descriptor": "xpub6CUGRUonZSQ4TWtTMmzXdrXDtyPWKi8QW9oD8bYQ3ZtWm2m9k6oGfD8pY9oGg2QpQmJ2s2Qv8qZ9HcZr7p3",
"block_explorer_url": "https://example-explorer.local/btc/address/1HowellsX8KDump9u2wQx3pP7mZxYk2s",
"last_seen_block_height": 286500,
"last_activity_at": new Date('2013-08-10T00:00:00Z'),
"amount_crypto": 8000.0,
"usd_value_at_loss": 7500000.0,
"usd_value_at_ath": 552000000.0,
"usd_value_current": 336000000.0,
"utxo_unspent_confirmed": true,
"notes": "Address used as illustrative anchor; figures reflect widely reported estimates and simplified pricing assumptions.",
},
{
// type code here for "relation_one" field
"chain": "other",
"wallet_type": "custodial",
"label": "IronKey Locked Wallet",
"address": "1IronKeyPuzz1e7o0m9sV2u3xQ5b6n7m8",
"xpub_or_descriptor": "xpub6Fh9cPjQWk3Qv6hQ9y1o1dG7V8kYp2Q2x3W9aZ7gV8hK6pQ1m2n3b4v5c6d7e8f9",
"block_explorer_url": "https://example-explorer.local/btc/address/1IronKeyPuzz1e7o0m9sV2u3xQ5b6n7m8",
"last_seen_block_height": 139500,
"last_activity_at": new Date('2011-07-15T00:00:00Z'),
"amount_crypto": 7002.0,
"usd_value_at_loss": 56000.0,
"usd_value_at_ath": 483138000.0,
"usd_value_current": 294084000.0,
"utxo_unspent_confirmed": true,
"notes": "Modeled after a hardware attempt limit narrative; address and descriptor are realistic placeholders.",
},
{
// type code here for "relation_one" field
"chain": "monero",
"wallet_type": "multisig",
"label": "Exchange Cold Storage Cluster",
"address": "3GhostExch4ngeC0ldSt0r4ge7k2m9qP",
"xpub_or_descriptor": "unknown",
"block_explorer_url": "https://example-explorer.local/btc/address/3GhostExch4ngeC0ldSt0r4ge7k2m9qP",
"last_seen_block_height": 556000,
"last_activity_at": new Date('2018-12-09T00:00:00Z'),
"amount_crypto": 26000.0,
"usd_value_at_loss": 93000000.0,
"usd_value_at_ath": 1794000000.0,
"usd_value_current": 1092000000.0,
"utxo_unspent_confirmed": false,
"notes": "Custodial cases often involve multiple addresses and partial records; this entry represents an aggregated view.",
},
];
const TimelineEventsData = [
{
// type code here for "relation_one" field
"event_type": "press_update",
"title": "Initial BTC acquisition",
"description": "Coins acquired through early mining and purchases; records reconstructed from period statements.",
"event_at": new Date('2010-12-01T00:00:00Z'),
"block_height": 120000,
"price_usd_snapshot": 0.23,
"source_url": "https://example-sources.local/cases/landfill/acquisition",
// type code here for "images" field
// type code here for "files" field
},
{
// type code here for "relation_one" field
"event_type": "press_update",
"title": "Drive discarded during cleanup",
"description": "Storage device containing wallet file removed during household cleanup and taken to municipal waste.",
"event_at": new Date('2013-08-10T00:00:00Z'),
"block_height": 286500,
"price_usd_snapshot": 120.0,
"source_url": "https://example-sources.local/cases/landfill/loss",
// type code here for "images" field
// type code here for "files" field
},
{
// type code here for "relation_one" field
"event_type": "acquisition",
"title": "Password attempts exhausted to near limit",
"description": "Multiple failed attempts recorded; remaining attempts reported as low, increasing risk of permanent lockout.",
"event_at": new Date('2011-07-15T00:00:00Z'),
"block_height": 139500,
"price_usd_snapshot": 8.0,
"source_url": "https://example-sources.local/cases/password-puzzle/loss",
// type code here for "images" field
// type code here for "files" field
},
];
const CaseArtifactsData = [
{
// type code here for "relation_one" field
"artifact_type": "plausible_document",
"title": "Excavation Proposal Summary",
"content": "Document outlines a staged search plan, environmental safeguards, and contingency budgets for a controlled excavation effort.",
"source_citation": "Simulated internal memo for demo content",
// type code here for "files" field
"is_public": true,
},
{
// type code here for "relation_one" field
"artifact_type": "plausible_document",
"title": "Device Security Expert Statement",
"content": "Statement explains attempt counters, threat models, and why invasive extraction is costly and uncertain.",
"source_citation": "Simulated expert testimony for demo content",
// type code here for "files" field
"is_public": true,
},
{
// type code here for "relation_one" field
"artifact_type": "expert_testimony",
"title": "Cluster Movement Analysis",
"content": "Analysis reviews address clustering assumptions, identifies consolidation patterns, and notes uncertainty from custodial mixing.",
"source_citation": "Simulated on chain analysis for demo content",
// type code here for "files" field
"is_public": true,
},
];
const RecoveryAnalysesData = [
{
// type code here for "relation_one" field
"recovery_status": "partially_recovered",
"recovery_vector": "hardware_chip_off",
"approach_summary": "Controlled excavation with sorting, drive imaging, and staged verification under environmental constraints.",
"estimated_cost_usd": 12000000.0,
"estimated_benefit_usd": 336000000.0,
"estimated_probability_percent": 8.5,
"analysis_at": new Date('2026-01-15T00:00:00Z'),
"risk_notes": "High regulatory risk and uncertain media driven funding; physical degradation probability increases over time.",
},
{
// type code here for "relation_one" field
"recovery_status": "deemed_impossible",
"recovery_vector": "social_engineering",
"approach_summary": "Non destructive attempts prioritized; invasive extraction considered only with escrow and strict chain of custody.",
"estimated_cost_usd": 350000.0,
"estimated_benefit_usd": 294084000.0,
"estimated_probability_percent": 12.0,
"analysis_at": new Date('2026-01-22T00:00:00Z'),
"risk_notes": "Attempt limit and secure element protections dominate; reputational and fraud risks are significant.",
},
{
// type code here for "relation_one" field
"recovery_status": "stalled",
"recovery_vector": "neural_memory_reconstruction",
"approach_summary": "Asset tracing and claims process; recovery depends on locating keys and reconciling liabilities.",
"estimated_cost_usd": 9000000.0,
"estimated_benefit_usd": 1092000000.0,
"estimated_probability_percent": 25.0,
"analysis_at": new Date('2026-01-10T00:00:00Z'),
"risk_notes": "Complex proceedings and partial records; distributions may be delayed and outcomes depend on litigation.",
},
];
const TagsData = [
{
"name": "Landfill recovery",
"slug": "landfill-recovery",
"tag_type": "artifact",
"description": "Cases involving physical media loss and excavation attempts.",
},
{
"name": "Hardware lockout",
"slug": "hardware-lockout",
"tag_type": "other",
"description": "Cases where secure hardware enforces attempt limits or requires lost credentials.",
},
{
"name": "Custodial collapse",
"slug": "custodial-collapse",
"tag_type": "mechanism",
"description": "Exchange or custodian failures leading to inaccessible funds.",
},
];
const RelatedCasesData = [
{
// type code here for "relation_one" field
// type code here for "relation_one" field
"relation_type": "other",
"notes": "Both involve accidental destruction or loss of the only backup medium.",
},
{
// type code here for "relation_one" field
// type code here for "relation_one" field
"relation_type": "same_location",
"notes": "Both show how small operational mistakes become catastrophic under strong cryptography.",
},
{
// type code here for "relation_one" field
// type code here for "relation_one" field
"relation_type": "same_location",
"notes": "Contrasts centralized custody failure with self custody physical loss.",
},
];
// Similar logic for "relation_many"
async function associateCaseFileWithAuthor() {
const relatedAuthor0 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const CaseFile0 = await CaseFiles.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (CaseFile0?.setAuthor)
{
await
CaseFile0.
setAuthor(relatedAuthor0);
}
const relatedAuthor1 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const CaseFile1 = await CaseFiles.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (CaseFile1?.setAuthor)
{
await
CaseFile1.
setAuthor(relatedAuthor1);
}
const relatedAuthor2 = await Users.findOne({
offset: Math.floor(Math.random() * (await Users.count())),
});
const CaseFile2 = await CaseFiles.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (CaseFile2?.setAuthor)
{
await
CaseFile2.
setAuthor(relatedAuthor2);
}
}
// Similar logic for "relation_many"
// Similar logic for "relation_many"
// Similar logic for "relation_many"
// Similar logic for "relation_many"
// Similar logic for "relation_many"
// Similar logic for "relation_many"
async function associateWalletWithCase_file() {
const relatedCase_file0 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const Wallet0 = await Wallets.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (Wallet0?.setCase_file)
{
await
Wallet0.
setCase_file(relatedCase_file0);
}
const relatedCase_file1 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const Wallet1 = await Wallets.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (Wallet1?.setCase_file)
{
await
Wallet1.
setCase_file(relatedCase_file1);
}
const relatedCase_file2 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const Wallet2 = await Wallets.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (Wallet2?.setCase_file)
{
await
Wallet2.
setCase_file(relatedCase_file2);
}
}
async function associateTimelineEventWithCase_file() {
const relatedCase_file0 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const TimelineEvent0 = await TimelineEvents.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (TimelineEvent0?.setCase_file)
{
await
TimelineEvent0.
setCase_file(relatedCase_file0);
}
const relatedCase_file1 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const TimelineEvent1 = await TimelineEvents.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (TimelineEvent1?.setCase_file)
{
await
TimelineEvent1.
setCase_file(relatedCase_file1);
}
const relatedCase_file2 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const TimelineEvent2 = await TimelineEvents.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (TimelineEvent2?.setCase_file)
{
await
TimelineEvent2.
setCase_file(relatedCase_file2);
}
}
async function associateCaseArtifactWithCase_file() {
const relatedCase_file0 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const CaseArtifact0 = await CaseArtifacts.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (CaseArtifact0?.setCase_file)
{
await
CaseArtifact0.
setCase_file(relatedCase_file0);
}
const relatedCase_file1 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const CaseArtifact1 = await CaseArtifacts.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (CaseArtifact1?.setCase_file)
{
await
CaseArtifact1.
setCase_file(relatedCase_file1);
}
const relatedCase_file2 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const CaseArtifact2 = await CaseArtifacts.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (CaseArtifact2?.setCase_file)
{
await
CaseArtifact2.
setCase_file(relatedCase_file2);
}
}
async function associateRecoveryAnalysWithCase_file() {
const relatedCase_file0 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const RecoveryAnalys0 = await RecoveryAnalyses.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (RecoveryAnalys0?.setCase_file)
{
await
RecoveryAnalys0.
setCase_file(relatedCase_file0);
}
const relatedCase_file1 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const RecoveryAnalys1 = await RecoveryAnalyses.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (RecoveryAnalys1?.setCase_file)
{
await
RecoveryAnalys1.
setCase_file(relatedCase_file1);
}
const relatedCase_file2 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const RecoveryAnalys2 = await RecoveryAnalyses.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (RecoveryAnalys2?.setCase_file)
{
await
RecoveryAnalys2.
setCase_file(relatedCase_file2);
}
}
async function associateRelatedCasWithFrom_case_file() {
const relatedFrom_case_file0 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const RelatedCas0 = await RelatedCases.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (RelatedCas0?.setFrom_case_file)
{
await
RelatedCas0.
setFrom_case_file(relatedFrom_case_file0);
}
const relatedFrom_case_file1 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const RelatedCas1 = await RelatedCases.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (RelatedCas1?.setFrom_case_file)
{
await
RelatedCas1.
setFrom_case_file(relatedFrom_case_file1);
}
const relatedFrom_case_file2 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const RelatedCas2 = await RelatedCases.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (RelatedCas2?.setFrom_case_file)
{
await
RelatedCas2.
setFrom_case_file(relatedFrom_case_file2);
}
}
async function associateRelatedCasWithTo_case_file() {
const relatedTo_case_file0 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const RelatedCas0 = await RelatedCases.findOne({
order: [['id', 'ASC']],
offset: 0
});
if (RelatedCas0?.setTo_case_file)
{
await
RelatedCas0.
setTo_case_file(relatedTo_case_file0);
}
const relatedTo_case_file1 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const RelatedCas1 = await RelatedCases.findOne({
order: [['id', 'ASC']],
offset: 1
});
if (RelatedCas1?.setTo_case_file)
{
await
RelatedCas1.
setTo_case_file(relatedTo_case_file1);
}
const relatedTo_case_file2 = await CaseFiles.findOne({
offset: Math.floor(Math.random() * (await CaseFiles.count())),
});
const RelatedCas2 = await RelatedCases.findOne({
order: [['id', 'ASC']],
offset: 2
});
if (RelatedCas2?.setTo_case_file)
{
await
RelatedCas2.
setTo_case_file(relatedTo_case_file2);
}
}
module.exports = {
up: async (queryInterface, Sequelize) => {
await CaseFiles.bulkCreate(CaseFilesData);
await Wallets.bulkCreate(WalletsData);
await TimelineEvents.bulkCreate(TimelineEventsData);
await CaseArtifacts.bulkCreate(CaseArtifactsData);
await RecoveryAnalyses.bulkCreate(RecoveryAnalysesData);
await Tags.bulkCreate(TagsData);
await RelatedCases.bulkCreate(RelatedCasesData);
await Promise.all([
// Similar logic for "relation_many"
await associateCaseFileWithAuthor(),
// Similar logic for "relation_many"
// Similar logic for "relation_many"
// Similar logic for "relation_many"
// Similar logic for "relation_many"
// Similar logic for "relation_many"
// Similar logic for "relation_many"
await associateWalletWithCase_file(),
await associateTimelineEventWithCase_file(),
await associateCaseArtifactWithCase_file(),
await associateRecoveryAnalysWithCase_file(),
await associateRelatedCasWithFrom_case_file(),
await associateRelatedCasWithTo_case_file(),
]);
},
down: async (queryInterface, Sequelize) => {
await queryInterface.bulkDelete('case_files', null, {});
await queryInterface.bulkDelete('wallets', null, {});
await queryInterface.bulkDelete('timeline_events', null, {});
await queryInterface.bulkDelete('case_artifacts', null, {});
await queryInterface.bulkDelete('recovery_analyses', null, {});
await queryInterface.bulkDelete('tags', null, {});
await queryInterface.bulkDelete('related_cases', null, {});
},
};