➕ Additions
This commit is contained in:
@@ -101,13 +101,180 @@ const ComicSchema = mongoose.Schema(
|
||||
},
|
||||
sourcedMetadata: {
|
||||
comicInfo: { type: mongoose.Schema.Types.Mixed, default: {} },
|
||||
comicvine: { type: mongoose.Schema.Types.Mixed, default: {} }, // Set as a freeform object
|
||||
comicvine: { type: mongoose.Schema.Types.Mixed, default: {} },
|
||||
metron: { type: mongoose.Schema.Types.Mixed, default: {} },
|
||||
gcd: { type: mongoose.Schema.Types.Mixed, default: {} },
|
||||
locg: {
|
||||
type: LOCGSchema,
|
||||
es_indexed: true,
|
||||
default: {},
|
||||
},
|
||||
},
|
||||
// Canonical metadata - user-curated "canonical" values with source attribution
|
||||
canonicalMetadata: {
|
||||
// Core identifying information
|
||||
title: {
|
||||
value: { type: String, es_indexed: true },
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
|
||||
// Series information
|
||||
series: {
|
||||
name: {
|
||||
value: { type: String, es_indexed: true },
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
volume: {
|
||||
value: Number,
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
startYear: {
|
||||
value: Number,
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
}
|
||||
},
|
||||
|
||||
// Issue information
|
||||
issueNumber: {
|
||||
value: { type: String, es_indexed: true },
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
|
||||
// Publishing information
|
||||
publisher: {
|
||||
value: { type: String, es_indexed: true },
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
|
||||
publicationDate: {
|
||||
value: Date,
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
|
||||
coverDate: {
|
||||
value: Date,
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
|
||||
// Content information
|
||||
pageCount: {
|
||||
value: Number,
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
|
||||
summary: {
|
||||
value: String,
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
|
||||
// Creator information - array with source attribution
|
||||
creators: [{
|
||||
_id: false,
|
||||
name: String,
|
||||
role: String,
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
}],
|
||||
|
||||
// Character and genre arrays with source tracking
|
||||
characters: {
|
||||
values: [String],
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
|
||||
genres: {
|
||||
values: [String],
|
||||
source: {
|
||||
type: String,
|
||||
enum: ['comicInfo', 'comicvine', 'metron', 'gcd', 'locg', 'inferred', 'user'],
|
||||
default: 'inferred'
|
||||
},
|
||||
userSelected: { type: Boolean, default: false },
|
||||
lastModified: { type: Date, default: Date.now }
|
||||
},
|
||||
|
||||
// Canonical metadata tracking
|
||||
lastCanonicalUpdate: { type: Date, default: Date.now },
|
||||
hasUserModifications: { type: Boolean, default: false },
|
||||
|
||||
// Quality and completeness tracking
|
||||
completeness: {
|
||||
score: { type: Number, min: 0, max: 100, default: 0 },
|
||||
missingFields: [String],
|
||||
lastCalculated: { type: Date, default: Date.now }
|
||||
}
|
||||
},
|
||||
rawFileDetails: {
|
||||
type: RawFileDetailsSchema,
|
||||
es_indexed: true,
|
||||
|
||||
Reference in New Issue
Block a user