Expand character model with additional attributes and advanced customization options
- Added fields such as `nickname`, `age`, `gender`, `species`, `nationality`, `status`, and others to enhance character customization. - Modified localization files to include new field labels and placeholders. - Updated `CharacterComponent` and `CharacterDetail` components with UI elements for the newly added attributes. - Introduced "Advanced Mode" toggle to manage visibility of extended customization options. - Refactored database models and repository methods (`addNewCharacter`, `updateCharacter`, and `fetchCharacters`) to handle the extended schema. - Improved data encryption and decryption workflows for secure storage of added attributes. - Enhanced user experience by reorganizing character customization layouts.
This commit is contained in:
@@ -13,6 +13,12 @@ export interface CharacterPropsPost {
|
||||
id: string | null;
|
||||
name: string;
|
||||
lastName: string;
|
||||
nickname: string;
|
||||
age: string;
|
||||
gender: string;
|
||||
species: string;
|
||||
nationality: string;
|
||||
status: 'alive' | 'dead' | 'unknown';
|
||||
category: CharacterCategory;
|
||||
title: string;
|
||||
image: string;
|
||||
@@ -24,9 +30,24 @@ export interface CharacterPropsPost {
|
||||
strengths: { name: string }[];
|
||||
goals: { name: string }[];
|
||||
motivations: { name: string }[];
|
||||
arc: { name: string }[];
|
||||
secrets: { name: string }[];
|
||||
fears: { name: string }[];
|
||||
flaws: { name: string }[];
|
||||
beliefs: { name: string }[];
|
||||
conflicts: { name: string }[];
|
||||
quotes: { name: string }[];
|
||||
distinguishingMarks: { name: string }[];
|
||||
items: { name: string }[];
|
||||
affiliations: { name: string }[];
|
||||
role: string;
|
||||
biography?: string;
|
||||
history?: string;
|
||||
speechPattern?: string;
|
||||
catchphrase?: string;
|
||||
residence?: string;
|
||||
notes?: string;
|
||||
color?: string;
|
||||
}
|
||||
|
||||
|
||||
@@ -34,12 +55,23 @@ export interface CharacterProps {
|
||||
id: string;
|
||||
name: string;
|
||||
lastName: string;
|
||||
nickname: string;
|
||||
age: string;
|
||||
gender: string;
|
||||
species: string;
|
||||
nationality: string;
|
||||
status: string;
|
||||
title: string;
|
||||
category: string;
|
||||
image: string;
|
||||
role: string;
|
||||
biography: string;
|
||||
history: string;
|
||||
speechPattern: string;
|
||||
catchphrase: string;
|
||||
residence: string;
|
||||
notes: string;
|
||||
color: string;
|
||||
}
|
||||
|
||||
export interface CharacterListResponse {
|
||||
@@ -51,12 +83,23 @@ export interface CompleteCharacterProps {
|
||||
id?: string;
|
||||
name: string;
|
||||
lastName: string;
|
||||
nickname?: string;
|
||||
age?: string;
|
||||
gender?: string;
|
||||
species?: string;
|
||||
nationality?: string;
|
||||
status?: string;
|
||||
title: string;
|
||||
category: string;
|
||||
image?: string;
|
||||
role: string;
|
||||
biography: string;
|
||||
history: string;
|
||||
speechPattern?: string;
|
||||
catchphrase?: string;
|
||||
residence?: string;
|
||||
notes?: string;
|
||||
color?: string;
|
||||
[key: string]: Attribute[] | string | undefined;
|
||||
}
|
||||
|
||||
@@ -108,12 +151,23 @@ export default class Character {
|
||||
id: encryptedCharacter.character_id,
|
||||
name: encryptedCharacter.first_name ? System.decryptDataWithUserKey(encryptedCharacter.first_name, userEncryptionKey) : '',
|
||||
lastName: encryptedCharacter.last_name ? System.decryptDataWithUserKey(encryptedCharacter.last_name, userEncryptionKey) : '',
|
||||
nickname: encryptedCharacter.nickname ? System.decryptDataWithUserKey(encryptedCharacter.nickname, userEncryptionKey) : '',
|
||||
age: encryptedCharacter.age ? System.decryptDataWithUserKey(encryptedCharacter.age, userEncryptionKey) : '',
|
||||
gender: encryptedCharacter.gender ? System.decryptDataWithUserKey(encryptedCharacter.gender, userEncryptionKey) : '',
|
||||
species: encryptedCharacter.species ? System.decryptDataWithUserKey(encryptedCharacter.species, userEncryptionKey) : '',
|
||||
nationality: encryptedCharacter.nationality ? System.decryptDataWithUserKey(encryptedCharacter.nationality, userEncryptionKey) : '',
|
||||
status: encryptedCharacter.status ? System.decryptDataWithUserKey(encryptedCharacter.status, userEncryptionKey) : 'alive',
|
||||
title: encryptedCharacter.title ? System.decryptDataWithUserKey(encryptedCharacter.title, userEncryptionKey) : '',
|
||||
category: encryptedCharacter.category ? System.decryptDataWithUserKey(encryptedCharacter.category, userEncryptionKey) : '',
|
||||
image: encryptedCharacter.image ? System.decryptDataWithUserKey(encryptedCharacter.image, userEncryptionKey) : '',
|
||||
role: encryptedCharacter.role ? System.decryptDataWithUserKey(encryptedCharacter.role, userEncryptionKey) : '',
|
||||
biography: encryptedCharacter.biography ? System.decryptDataWithUserKey(encryptedCharacter.biography, userEncryptionKey) : '',
|
||||
history: encryptedCharacter.history ? System.decryptDataWithUserKey(encryptedCharacter.history, userEncryptionKey) : '',
|
||||
speechPattern: encryptedCharacter.speech_pattern ? System.decryptDataWithUserKey(encryptedCharacter.speech_pattern, userEncryptionKey) : '',
|
||||
catchphrase: encryptedCharacter.catchphrase ? System.decryptDataWithUserKey(encryptedCharacter.catchphrase, userEncryptionKey) : '',
|
||||
residence: encryptedCharacter.residence ? System.decryptDataWithUserKey(encryptedCharacter.residence, userEncryptionKey) : '',
|
||||
notes: encryptedCharacter.notes ? System.decryptDataWithUserKey(encryptedCharacter.notes, userEncryptionKey) : '',
|
||||
color: encryptedCharacter.color ? System.decryptDataWithUserKey(encryptedCharacter.color, userEncryptionKey) : '',
|
||||
})
|
||||
}
|
||||
return { characters: decryptedCharacterList, enabled };
|
||||
@@ -132,15 +186,30 @@ export default class Character {
|
||||
public static addNewCharacter(userId: string, character: CharacterPropsPost, bookId: string, lang: 'fr' | 'en' = 'fr', existingCharacterId?: string): string {
|
||||
const userEncryptionKey: string = getUserEncryptionKey(userId);
|
||||
const characterId: string = existingCharacterId || System.createUniqueId();
|
||||
const encryptedName: string = System.encryptDataWithUserKey(character.name, userEncryptionKey);
|
||||
const encryptedLastName: string = System.encryptDataWithUserKey(character.lastName, userEncryptionKey);
|
||||
const encryptedTitle: string = System.encryptDataWithUserKey(character.title, userEncryptionKey);
|
||||
const encryptedCategory: string = System.encryptDataWithUserKey(character.category, userEncryptionKey);
|
||||
const encryptedImage: string = System.encryptDataWithUserKey(character.image, userEncryptionKey);
|
||||
const encryptedRole: string = System.encryptDataWithUserKey(character.role, userEncryptionKey);
|
||||
const encryptedBiography: string = System.encryptDataWithUserKey(character.biography ? character.biography : '', userEncryptionKey);
|
||||
const encryptedHistory: string = System.encryptDataWithUserKey(character.history ? character.history : '', userEncryptionKey);
|
||||
CharacterRepo.addNewCharacter(userId, characterId, encryptedName, encryptedLastName, encryptedTitle, encryptedCategory, encryptedImage, encryptedRole, encryptedBiography, encryptedHistory, bookId, lang);
|
||||
|
||||
const characterData = {
|
||||
firstName: System.encryptDataWithUserKey(character.name, userEncryptionKey),
|
||||
lastName: System.encryptDataWithUserKey(character.lastName, userEncryptionKey),
|
||||
nickname: System.encryptDataWithUserKey(character.nickname || '', userEncryptionKey),
|
||||
age: System.encryptDataWithUserKey(character.age || '', userEncryptionKey),
|
||||
gender: System.encryptDataWithUserKey(character.gender || '', userEncryptionKey),
|
||||
species: System.encryptDataWithUserKey(character.species || '', userEncryptionKey),
|
||||
nationality: System.encryptDataWithUserKey(character.nationality || '', userEncryptionKey),
|
||||
status: System.encryptDataWithUserKey(character.status || 'alive', userEncryptionKey),
|
||||
title: System.encryptDataWithUserKey(character.title, userEncryptionKey),
|
||||
category: System.encryptDataWithUserKey(character.category, userEncryptionKey),
|
||||
image: System.encryptDataWithUserKey(character.image, userEncryptionKey),
|
||||
role: System.encryptDataWithUserKey(character.role, userEncryptionKey),
|
||||
biography: System.encryptDataWithUserKey(character.biography || '', userEncryptionKey),
|
||||
history: System.encryptDataWithUserKey(character.history || '', userEncryptionKey),
|
||||
speechPattern: System.encryptDataWithUserKey(character.speechPattern || '', userEncryptionKey),
|
||||
catchphrase: System.encryptDataWithUserKey(character.catchphrase || '', userEncryptionKey),
|
||||
residence: System.encryptDataWithUserKey(character.residence || '', userEncryptionKey),
|
||||
notes: System.encryptDataWithUserKey(character.notes || '', userEncryptionKey),
|
||||
color: System.encryptDataWithUserKey(character.color || '', userEncryptionKey),
|
||||
};
|
||||
|
||||
CharacterRepo.addNewCharacter(userId, characterId, characterData, bookId, lang);
|
||||
const characterPropertyKeys: string[] = Object.keys(character);
|
||||
for (const propertyKey of characterPropertyKeys) {
|
||||
if (Array.isArray(character[propertyKey as keyof CharacterPropsPost])) {
|
||||
@@ -170,15 +239,30 @@ export default class Character {
|
||||
if (!character.id) {
|
||||
return false;
|
||||
}
|
||||
const encryptedName: string = System.encryptDataWithUserKey(character.name, userEncryptionKey);
|
||||
const encryptedLastName: string = System.encryptDataWithUserKey(character.lastName, userEncryptionKey);
|
||||
const encryptedTitle: string = System.encryptDataWithUserKey(character.title, userEncryptionKey);
|
||||
const encryptedCategory: string = System.encryptDataWithUserKey(character.category, userEncryptionKey);
|
||||
const encryptedImage: string = System.encryptDataWithUserKey(character.image, userEncryptionKey);
|
||||
const encryptedRole: string = System.encryptDataWithUserKey(character.role, userEncryptionKey);
|
||||
const encryptedBiography: string = System.encryptDataWithUserKey(character.biography ? character.biography : '', userEncryptionKey);
|
||||
const encryptedHistory: string = System.encryptDataWithUserKey(character.history ? character.history : '', userEncryptionKey);
|
||||
return CharacterRepo.updateCharacter(userId, character.id, encryptedName, encryptedLastName, encryptedTitle, encryptedCategory, encryptedImage, encryptedRole, encryptedBiography, encryptedHistory, System.timeStampInSeconds(), lang);
|
||||
|
||||
const characterData = {
|
||||
firstName: System.encryptDataWithUserKey(character.name, userEncryptionKey),
|
||||
lastName: System.encryptDataWithUserKey(character.lastName, userEncryptionKey),
|
||||
nickname: System.encryptDataWithUserKey(character.nickname || '', userEncryptionKey),
|
||||
age: System.encryptDataWithUserKey(character.age || '', userEncryptionKey),
|
||||
gender: System.encryptDataWithUserKey(character.gender || '', userEncryptionKey),
|
||||
species: System.encryptDataWithUserKey(character.species || '', userEncryptionKey),
|
||||
nationality: System.encryptDataWithUserKey(character.nationality || '', userEncryptionKey),
|
||||
status: System.encryptDataWithUserKey(character.status || 'alive', userEncryptionKey),
|
||||
title: System.encryptDataWithUserKey(character.title, userEncryptionKey),
|
||||
category: System.encryptDataWithUserKey(character.category, userEncryptionKey),
|
||||
image: System.encryptDataWithUserKey(character.image, userEncryptionKey),
|
||||
role: System.encryptDataWithUserKey(character.role, userEncryptionKey),
|
||||
biography: System.encryptDataWithUserKey(character.biography || '', userEncryptionKey),
|
||||
history: System.encryptDataWithUserKey(character.history || '', userEncryptionKey),
|
||||
speechPattern: System.encryptDataWithUserKey(character.speechPattern || '', userEncryptionKey),
|
||||
catchphrase: System.encryptDataWithUserKey(character.catchphrase || '', userEncryptionKey),
|
||||
residence: System.encryptDataWithUserKey(character.residence || '', userEncryptionKey),
|
||||
notes: System.encryptDataWithUserKey(character.notes || '', userEncryptionKey),
|
||||
color: System.encryptDataWithUserKey(character.color || '', userEncryptionKey),
|
||||
};
|
||||
|
||||
return CharacterRepo.updateCharacter(userId, character.id, characterData, System.timeStampInSeconds(), lang);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -285,11 +369,22 @@ export default class Character {
|
||||
id: '',
|
||||
name: encryptedCharacter.first_name ? System.decryptDataWithUserKey(encryptedCharacter.first_name, userEncryptionKey) : '',
|
||||
lastName: encryptedCharacter.last_name ? System.decryptDataWithUserKey(encryptedCharacter.last_name, userEncryptionKey) : '',
|
||||
title: encryptedCharacter.title ? System.decryptDataWithUserKey(encryptedCharacter.title, userEncryptionKey) : '',
|
||||
category: encryptedCharacter.category ? System.decryptDataWithUserKey(encryptedCharacter.category, userEncryptionKey) : '',
|
||||
role: encryptedCharacter.role ? System.decryptDataWithUserKey(encryptedCharacter.role, userEncryptionKey) : '',
|
||||
biography: encryptedCharacter.biography ? System.decryptDataWithUserKey(encryptedCharacter.biography, userEncryptionKey) : '',
|
||||
history: encryptedCharacter.history ? System.decryptDataWithUserKey(encryptedCharacter.history, userEncryptionKey) : '',
|
||||
nickname: encryptedCharacter.nickname ? System.decryptDataWithUserKey(encryptedCharacter.nickname as string, userEncryptionKey) : '',
|
||||
age: encryptedCharacter.age ? System.decryptDataWithUserKey(encryptedCharacter.age as string, userEncryptionKey) : '',
|
||||
gender: encryptedCharacter.gender ? System.decryptDataWithUserKey(encryptedCharacter.gender as string, userEncryptionKey) : '',
|
||||
species: encryptedCharacter.species ? System.decryptDataWithUserKey(encryptedCharacter.species as string, userEncryptionKey) : '',
|
||||
nationality: encryptedCharacter.nationality ? System.decryptDataWithUserKey(encryptedCharacter.nationality as string, userEncryptionKey) : '',
|
||||
status: encryptedCharacter.status ? System.decryptDataWithUserKey(encryptedCharacter.status as string, userEncryptionKey) : 'alive',
|
||||
title: encryptedCharacter.title ? System.decryptDataWithUserKey(encryptedCharacter.title as string, userEncryptionKey) : '',
|
||||
category: encryptedCharacter.category ? System.decryptDataWithUserKey(encryptedCharacter.category as string, userEncryptionKey) : '',
|
||||
role: encryptedCharacter.role ? System.decryptDataWithUserKey(encryptedCharacter.role as string, userEncryptionKey) : '',
|
||||
biography: encryptedCharacter.biography ? System.decryptDataWithUserKey(encryptedCharacter.biography as string, userEncryptionKey) : '',
|
||||
history: encryptedCharacter.history ? System.decryptDataWithUserKey(encryptedCharacter.history as string, userEncryptionKey) : '',
|
||||
speechPattern: encryptedCharacter.speech_pattern ? System.decryptDataWithUserKey(encryptedCharacter.speech_pattern as string, userEncryptionKey) : '',
|
||||
catchphrase: encryptedCharacter.catchphrase ? System.decryptDataWithUserKey(encryptedCharacter.catchphrase as string, userEncryptionKey) : '',
|
||||
residence: encryptedCharacter.residence ? System.decryptDataWithUserKey(encryptedCharacter.residence as string, userEncryptionKey) : '',
|
||||
notes: encryptedCharacter.notes ? System.decryptDataWithUserKey(encryptedCharacter.notes as string, userEncryptionKey) : '',
|
||||
color: encryptedCharacter.color ? System.decryptDataWithUserKey(encryptedCharacter.color as string, userEncryptionKey) : '',
|
||||
physical: [],
|
||||
psychological: [],
|
||||
relations: [],
|
||||
@@ -297,7 +392,17 @@ export default class Character {
|
||||
weaknesses: [],
|
||||
strengths: [],
|
||||
goals: [],
|
||||
motivations: []
|
||||
motivations: [],
|
||||
arc: [],
|
||||
secrets: [],
|
||||
fears: [],
|
||||
flaws: [],
|
||||
beliefs: [],
|
||||
conflicts: [],
|
||||
quotes: [],
|
||||
distinguishingMarks: [],
|
||||
items: [],
|
||||
affiliations: []
|
||||
};
|
||||
completeCharactersMap.set(encryptedCharacter.character_id, decryptedCharacter);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user