Start implementation of branches, new form element tabledropdown, model improvements

This commit is contained in:
Torsten Schulz
2024-12-06 23:35:28 +01:00
parent 8c15fb7f2b
commit 1bb2bd49d5
57 changed files with 2176 additions and 170 deletions

View File

@@ -31,6 +31,18 @@ import Friendship from './community/friendship.js';
import FalukantUser from './falukant/data/user.js';
import RegionType from './falukant/type/region.js';
import RegionData from './falukant/data/region.js';
import FalukantCharacter from './falukant/data/character.js';
import FalukantPredefineFirstname from './falukant/predefine/firstname.js';
import FalukantPredefineLastname from './falukant/predefine/lastname.js';
import FalukantStock from './falukant/data/stock.js';
import FalukantStockType from './falukant/type/stock.js';
import Knowledge from './falukant/data/product_knowledge.js';
import ProductType from './falukant/type/product.js';
import TitleOfNobility from './falukant/type/title_of_nobility.js';
import TitleRequirement from './falukant/type/title_requirement.js';
import Branch from './falukant/data/branch.js';
import BranchType from './falukant/type/branch.js';
export default function setupAssociations() {
// UserParam related associations
@@ -181,4 +193,46 @@ export default function setupAssociations() {
FalukantUser.belongsTo(RegionData, { foreignKey: 'mainBranchRegionId', as: 'mainBranchRegion' });
RegionData.hasMany(FalukantUser, { foreignKey: 'mainBranchRegionId', as: 'users' });
FalukantCharacter.belongsTo(FalukantUser, { foreignKey: 'userId', as: 'user' });
FalukantUser.hasOne(FalukantCharacter, { foreignKey: 'userId', as: 'character' });
FalukantCharacter.belongsTo(FalukantPredefineFirstname, { foreignKey: 'firstName', as: 'definedFirstName' });
FalukantPredefineFirstname.hasMany(FalukantCharacter, { foreignKey: 'firstName', as: 'charactersWithFirstName' });
FalukantCharacter.belongsTo(FalukantPredefineLastname, { foreignKey: 'lastName', as: 'definedLastName' });
FalukantPredefineLastname.hasMany(FalukantCharacter, { foreignKey: 'lastName', as: 'charactersWithLastName' });
FalukantCharacter.belongsTo(TitleOfNobility, { foreignKey: 'titleOfNobility', as: 'nobleTitle' });
TitleOfNobility.hasMany(FalukantCharacter, { foreignKey: 'titleOfNobility', as: 'charactersWithNobleTitle' });
FalukantCharacter.belongsTo(RegionData, { foreignKey: 'regionId', as: 'region' });
RegionData.hasMany(FalukantCharacter, { foreignKey: 'regionId', as: 'charactersInRegion' });
FalukantStock.belongsTo(FalukantStockType, { foreignKey: 'stockTypeId', as: 'stockType' });
FalukantStockType.hasMany(FalukantStock, { foreignKey: 'stockTypeId', as: 'stocks' });
FalukantStock.belongsTo(FalukantUser, { foreignKey: 'userId', as: 'user' });
FalukantUser.hasMany(FalukantStock, { foreignKey: 'userId', as: 'stocks' });
FalukantStock.belongsTo(RegionData, { foreignKey: 'regionId', as: 'region' });
RegionData.hasMany(FalukantStock, { foreignKey: 'regionId', as: 'stocksInRegion' });
Knowledge.belongsTo(ProductType, { foreignKey: 'productTypeId', as: 'productType' });
ProductType.hasMany(Knowledge, { foreignKey: 'productTypeId', as: 'knowledges' });
Knowledge.belongsTo(FalukantCharacter, { foreignKey: 'characterId', as: 'character' });
FalukantCharacter.hasMany(Knowledge, { foreignKey: 'characterId', as: 'knowledges' });
TitleRequirement.belongsTo(TitleOfNobility, { foreignKey: 'titleId', as: 'title' });
TitleOfNobility.hasMany(TitleRequirement, { foreignKey: 'titleId', as: 'requirements' });
Branch.belongsTo(RegionData, { foreignKey: 'regionId', as: 'region' });
RegionData.hasMany(Branch, { foreignKey: 'regionId', as: 'branches' });
Branch.belongsTo(FalukantUser, { foreignKey: 'falukantUserId', as: 'user' });
FalukantUser.hasMany(Branch, { foreignKey: 'falukantUserId', as: 'branches' });
Branch.belongsTo(BranchType, { foreignKey: 'branchTypeId', as: 'branchType' });
BranchType.hasMany(Branch, { foreignKey: 'branchTypeId', as: 'branches' });
}

View File

@@ -0,0 +1,34 @@
import { Model, DataTypes } from 'sequelize';
import { sequelize } from '../../../utils/sequelize.js';
class Branch extends Model { }
Branch.init({
branchTypeId: {
type: DataTypes.INTEGER,
allowNull: false,
},
regionId: {
type: DataTypes.INTEGER,
allowNull: false,
},
falukantUserId: {
type: DataTypes.INTEGER,
allowNull: false,
},
}, {
sequelize,
modelName: 'BranchType',
tableName: 'branch',
schema: 'falukant_data',
timestamps: false,
underscored: true,
indexes: [
{
unique: true,
fields: ['region_id', 'falukant_user_id']
}
],
});
export default Branch;

View File

@@ -0,0 +1,49 @@
import { Model, DataTypes } from 'sequelize';
import { sequelize } from '../../../utils/sequelize.js';
class FalukantCharacter extends Model {};
FalukantCharacter.init({
userId: {
type: DataTypes.INTEGER,
allowNull: true,
},
regionId: {
type: DataTypes.INTEGER,
allowNull: false,
},
firstName: {
type: DataTypes.INTEGER,
allowNull: false,
},
lastName: {
type: DataTypes.INTEGER,
allowNull: false,
},
birthdate: {
type: DataTypes.DATE,
allowNull: false,
defaultValue: DataTypes.NOW
},
gender: {
type: DataTypes.STRING
},
health: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 100
},
titleOfNobility: {
type: DataTypes.INTEGER,
allowNull: false,
}
}, {
sequelize,
modelName: 'FalukantCharacter',
tableName: 'character',
schema: 'falukant_data',
timestamps: true,
underscored: true,
});
export default FalukantCharacter;

View File

@@ -0,0 +1,34 @@
import { Model, DataTypes } from 'sequelize';
import { sequelize } from '../../../utils/sequelize.js';
class Knowledge extends Model { }
Knowledge.init({
productId: {
type: DataTypes.INTEGER,
allowNull: false,
},
characterId: {
type: DataTypes.INTEGER,
allowNull: false,
},
knowledge: {
type: DataTypes.INTEGER,
allowNull: false,
defaultValue: 0,
}
}, {
sequelize,
modelName: 'Knowledge',
tableName: 'knowledge',
schema: 'falukant_data',
timestamps: false,
underscored: true,
hooks: {
beforeCreate: (knowledge) => {
knowledge.knowledge = Math.floor(Math.random() * 61) + 20;
}
}
});
export default Knowledge;

View File

@@ -0,0 +1,32 @@
import { Model, DataTypes } from 'sequelize';
import { sequelize } from '../../../utils/sequelize.js';
class FalukantStock extends Model { }
FalukantStock.init({
userId: {
type: DataTypes.INTEGER,
allowNull: false,
},
regionId: {
type: DataTypes.INTEGER,
allowNull: false,
},
stockTypeId: {
type: DataTypes.INTEGER,
allowNull: false,
},
quantity: {
type: DataTypes.INTEGER,
allowNull: false,
},
}, {
sequelize,
modelName: 'StockType',
tableName: 'stock',
schema: 'falukant_data',
timestamps: false,
underscored: true,
});
export default FalukantStock;

View File

@@ -14,7 +14,8 @@ FalukantUser.init({
schema: 'community'
},
key: 'id'
}
},
unique: true,
},
money: {
type: DataTypes.DECIMAL(10, 2),

View File

@@ -0,0 +1,26 @@
import { sequelize } from '../../../utils/sequelize.js';
import { DataTypes } from 'sequelize';
const FalukantPredefineFirstname = sequelize.define('firstname', {
name: {
type: DataTypes.STRING,
allowNull: false
},
gender: {
type: DataTypes.STRING,
allowNull: false
}
}, {
tableName: 'firstname',
schema: 'falukant_predefine',
underscored: true,
timestamps: false,
indexes: [
{
unique: true,
fields: ['name', 'gender']
}
],
});
export default FalukantPredefineFirstname;

View File

@@ -0,0 +1,23 @@
import { sequelize } from '../../../utils/sequelize.js';
import { DataTypes } from 'sequelize';
const FalukantPredefineLastname = sequelize.define('lastname', {
name: {
type: DataTypes.STRING,
length: 1,
allowNull: false
},
}, {
tableName: 'lastname',
schema: 'falukant_predefine',
underscored: true,
timestamps: false,
indexes: [
{
unique: true,
fields: ['name']
}
],
});
export default FalukantPredefineLastname;

View File

@@ -0,0 +1,30 @@
import { Model, DataTypes } from 'sequelize';
import { sequelize } from '../../../utils/sequelize.js';
class BranchType extends Model { }
BranchType.init({
labelTr: {
type: DataTypes.STRING,
allowNull: false,
},
baseCost: {
type: DataTypes.INTEGER,
allowNull: false,
}
}, {
sequelize,
modelName: 'BranchType',
tableName: 'branch',
schema: 'falukant_type',
timestamps: false,
underscored: true,
indexes: [
{
unique: true,
fields: ['label_tr']
}
],
});
export default BranchType;

View File

@@ -0,0 +1,38 @@
import { Model, DataTypes } from 'sequelize';
import { sequelize } from '../../../utils/sequelize.js';
class ProductType extends Model { }
ProductType.init({
labelTr: {
type: DataTypes.STRING,
allowNull: false,
},
category: {
type: DataTypes.INTEGER,
allowNull: false,
},
productionTime: {
type: DataTypes.INTEGER,
allowNull: false,
},
sellCost: {
type: DataTypes.INTEGER,
allowNull: false,
}
}, {
sequelize,
modelName: 'ProductType',
tableName: 'product',
schema: 'falukant_type',
timestamps: false,
underscored: true,
indexes: [
{
unique: true,
fields: ['label_tr']
}
],
});
export default ProductType;

View File

@@ -0,0 +1,24 @@
import { Model, DataTypes } from 'sequelize';
import { sequelize } from '../../../utils/sequelize.js';
class FalukantStockType extends Model { }
FalukantStockType.init({
labelTr: {
type: DataTypes.STRING,
allowNull: false,
},
cost: {
type: DataTypes.INTEGER,
allowNull: false,
}
}, {
sequelize,
modelName: 'StockType',
tableName: 'stock',
schema: 'falukant_type',
timestamps: false,
underscored: true,
});
export default FalukantStockType;

View File

@@ -0,0 +1,20 @@
import { Model, DataTypes } from 'sequelize';
import { sequelize } from '../../../utils/sequelize.js';
class TitleOfNobility extends Model { }
TitleOfNobility.init({
labelTr: {
type: DataTypes.STRING,
allowNull: false,
},
}, {
sequelize,
modelName: 'Title',
tableName: 'title',
schema: 'falukant_type',
timestamps: false,
underscored: true,
});
export default TitleOfNobility;

View File

@@ -0,0 +1,30 @@
import { Model, DataTypes } from 'sequelize';
import { sequelize } from '../../../utils/sequelize.js';
class TitleRequirement extends Model { }
TitleRequirement.init({
titleId: {
type: DataTypes.INTEGER,
allowNull: false,
primaryKey: true,
autoIncrement: true,
},
requirementType: {
type: DataTypes.STRING,
allowNull: false,
},
requirementValue: {
type: DataTypes.DECIMAL(14, 2),
allowNull: false,
},
}, {
sequelize,
modelName: 'TitleRequirement',
tableName: 'title_requirement',
schema: 'falukant_type',
timestamps: false,
underscored: true,
});
export default TitleRequirement;

View File

@@ -35,6 +35,17 @@ import Friendship from './community/friendship.js';
import FalukantUser from './falukant/data/user.js';
import RegionType from './falukant/type/region.js';
import RegionData from './falukant/data/region.js';
import FalukantPredefineFirstname from './falukant/predefine/firstname.js';
import FalukantPredefineLastname from './falukant/predefine/lastname.js';
import FalukantCharacter from './falukant/data/character.js';
import FalukantStock from './falukant/data/stock.js';
import FalukantStockType from './falukant/type/stock.js';
import ProductType from './falukant/type/product.js';
import Knowledge from './falukant/data/product_knowledge.js';
import TitleRequirement from './falukant/type/title_requirement.js';
import TitleOfNobility from './falukant/type/title_of_nobility.js';
import BranchType from './falukant/type/branch.js';
import Branch from './falukant/data/branch.js';
const models = {
SettingsType,
@@ -74,6 +85,17 @@ const models = {
RegionType,
RegionData,
FalukantUser,
FalukantPredefineFirstname,
FalukantPredefineLastname,
FalukantCharacter,
FalukantStock,
FalukantStockType,
ProductType,
Knowledge,
TitleOfNobility,
TitleRequirement,
BranchType,
Branch,
};
export default models;

View File

@@ -2,7 +2,7 @@ import { sequelize } from '../utils/sequelize.js';
export async function createTriggers() {
const createTriggerFunction = `
CREATE OR REPLACE FUNCTION create_user_param_visibility_trigger()
CREATE OR REPLACE FUNCTION community.create_user_param_visibility_trigger()
RETURNS TRIGGER AS $$
BEGIN
-- Check if UserParamVisibility already exists for this UserParam
@@ -32,7 +32,7 @@ export async function createTriggers() {
AFTER INSERT ON community.user_param
FOR EACH ROW
WHEN (NEW.id IS NOT NULL)
EXECUTE FUNCTION create_user_param_visibility_trigger();
EXECUTE FUNCTION community.create_user_param_visibility_trigger();
`;
const createUpdateTrigger = `
@@ -40,11 +40,11 @@ export async function createTriggers() {
AFTER UPDATE ON community.user_param
FOR EACH ROW
WHEN (NEW.id IS NOT NULL)
EXECUTE FUNCTION create_user_param_visibility_trigger();
EXECUTE FUNCTION community.create_user_param_visibility_trigger();
`;
const createDiaryHistoryTriggerFunction = `
CREATE OR REPLACE FUNCTION insert_diary_history()
CREATE OR REPLACE FUNCTION community.insert_diary_history()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO community.diary_history (diary_id, user_id, old_text, old_created_at, old_updated_at)
@@ -65,11 +65,11 @@ export async function createTriggers() {
BEFORE UPDATE ON community.diary
FOR EACH ROW
WHEN (OLD.id IS NOT NULL)
EXECUTE FUNCTION insert_diary_history();
EXECUTE FUNCTION community.insert_diary_history();
`;
const createTitleHistoryTriggerFunction = `
CREATE OR REPLACE FUNCTION insert_title_history()
CREATE OR REPLACE FUNCTION forum.insert_title_history()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO forum.title_history (title_id, old_title, changed_by, old_updated_at)
@@ -84,7 +84,44 @@ export async function createTriggers() {
BEFORE UPDATE ON forum.title
FOR EACH ROW
WHEN (OLD.id IS NOT NULL)
EXECUTE FUNCTION insert_title_history();
EXECUTE FUNCTION forum.insert_title_history();
`;
const createCharacterCreationTriggerMethod = `
CREATE OR REPLACE FUNCTION falukant_data.create_character_creation_trigger()
RETURNS TRIGGER AS $$
BEGIN
INSERT INTO falukant_data.knowledge (product_id, character_id)
SELECT id, NEW.id FROM falukant_type.product;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
`;
const createCharacterCreationTrigger = `
CREATE OR REPLACE TRIGGER character_creation_trigger
AFTER INSERT ON falukant_data.character
FOR EACH ROW
WHEN (NEW.id IS NOT NULL)
EXECUTE FUNCTION falukant_data.create_character_creation_trigger();
`;
const createKnowledgeTriggerMethod = `
CREATE OR REPLACE FUNCTION falukant_data.create_knowledge_trigger()
RETURNS TRIGGER AS $$
BEGIN
NEW.knowledge = random() * 61 + 20;
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
`;
const createKnowledgeTrigger = `
CREATE OR REPLACE TRIGGER knowledge_trigger
BEFORE INSERT ON falukant_data.knowledge
FOR EACH ROW
WHEN (NEW.id IS NOT NULL)
EXECUTE FUNCTION falukant_data.create_knowledge_trigger();
`;
try {
@@ -95,10 +132,14 @@ export async function createTriggers() {
await sequelize.query(createDiaryHistoryTrigger);
await sequelize.query(createTitleHistoryTriggerFunction);
await sequelize.query(createTitleHistoryTrigger);
await sequelize.query(createCharacterCreationTriggerMethod);
await sequelize.query(createCharacterCreationTrigger);
await sequelize.query(createKnowledgeTriggerMethod);
await sequelize.query(createKnowledgeTrigger);
console.log('Triggers created successfully');
} catch (error) {
console.error('Error creating triggers:', error);
}
}