@ecopex/ecopex-framework 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/index.js +5 -0
  2. package/libraries/fastify.js +120 -0
  3. package/libraries/knex.js +1 -1
  4. package/package.json +6 -2
  5. package/stores/base.js +1 -1
  6. package/utils/jsonRouteLoader.js +3 -3
  7. package/utils/middleware.js +1 -1
  8. package/utils/routeLoader.js +1 -1
  9. package/.env +0 -73
  10. package/database/migrations/20240000135243_timezones.js +0 -22
  11. package/database/migrations/20240000135244_countries.js +0 -23
  12. package/database/migrations/20240000135244_create_admins_table.js +0 -66
  13. package/database/migrations/20240000135244_currencies.js +0 -21
  14. package/database/migrations/20240000135244_languages.js +0 -21
  15. package/database/migrations/20240000135244_taxes.js +0 -10
  16. package/database/migrations/20240000135245_sites.js +0 -37
  17. package/database/migrations/20240000135246_payment_methods.js +0 -33
  18. package/database/migrations/20251016113547_devices.js +0 -37
  19. package/database/migrations/20251019192600_users.js +0 -62
  20. package/database/migrations/20251019213551_language_lines.js +0 -35
  21. package/database/migrations/20251222214131_category_groups.js +0 -18
  22. package/database/migrations/20251222214619_categories.js +0 -27
  23. package/database/migrations/20251222214848_brands.js +0 -23
  24. package/database/migrations/20251222214946_products.js +0 -30
  25. package/database/migrations/20251222215428_product_images.js +0 -18
  26. package/database/migrations/20251222215553_options.js +0 -30
  27. package/database/migrations/20251222215806_variants.js +0 -23
  28. package/database/migrations/20251222215940_attributes.js +0 -25
  29. package/database/migrations/20251222220135_discounts.js +0 -15
  30. package/database/migrations/20251222220253_reviews.js +0 -22
  31. package/database/migrations/20251222220341_favorites.js +0 -10
  32. package/database/migrations/20251222220422_search_logs.js +0 -17
  33. package/database/migrations/20251222220636_orders.js +0 -16
  34. package/database/migrations/20251222220806_order_items.js +0 -19
  35. package/database/migrations/20251222221317_order_statuses.js +0 -10
  36. package/database/migrations/20251222221446_order_payments.js +0 -13
  37. package/database/migrations/20251222221654_order_addresses.js +0 -23
  38. package/database/migrations/20251222221807_order_status_logs.js +0 -13
  39. package/database/seeds/admins.js +0 -37
  40. package/database/seeds/countries.js +0 -203
  41. package/database/seeds/currencies.js +0 -165
  42. package/database/seeds/languages.js +0 -113
  43. package/database/seeds/timezones.js +0 -149
  44. package/ecosystem.config.js +0 -26
  45. package/libraries/stores.js +0 -22
  46. package/routes/admin/auto/admins.json +0 -63
  47. package/routes/admin/auto/devices.json +0 -37
  48. package/routes/admin/auto/migrations.json +0 -21
  49. package/routes/admin/auto/users.json +0 -61
  50. package/routes/admin/middlewares/index.js +0 -87
  51. package/routes/admin/spec/auth.js +0 -626
  52. package/routes/admin/spec/users.js +0 -3
  53. package/routes/auto/handler.js +0 -635
  54. package/routes/common/auto/countries.json +0 -28
  55. package/routes/common/auto/currencies.json +0 -26
  56. package/routes/common/auto/languages.json +0 -26
  57. package/routes/common/auto/taxes.json +0 -46
  58. package/routes/common/auto/timezones.json +0 -29
  59. package/workers/admin.js +0 -124
  60. package/workers/api.js +0 -106
@@ -1,27 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema
3
- .createTable('categories', table => {
4
- table.increments('category_id').primary();
5
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
6
- table.integer('parent_id').unsigned().nullable().references('category_id').inTable('categories').onDelete('SET NULL');
7
- table.integer('category_group_id').unsigned().references('category_group_id').inTable('category_groups');
8
- table.integer('order').notNullable().defaultTo(0);
9
- table.boolean('is_active').defaultTo(true);
10
- table.string('image').nullable();
11
- table.string('icon').nullable();
12
- table.string('color', 7).nullable();
13
- table.timestamps(true, true);
14
- })
15
- .createTable('category_translations', table => {
16
- table.increments('category_translation_id').primary();
17
- table.integer('category_id').unsigned().references('category_id').inTable('categories').onDelete('CASCADE');
18
- table.integer('language_id').unsigned().references('language_id').inTable('languages');
19
- table.string('name').notNullable();
20
- table.text('description').nullable();
21
- table.string('slug').notNullable();
22
- });
23
-
24
- exports.down = knex =>
25
- knex.schema
26
- .dropTable('category_translations')
27
- .dropTable('categories');
@@ -1,23 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema
3
- .createTable('brands', table => {
4
- table.increments('brand_id').primary();
5
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
6
- table.boolean('is_active').defaultTo(true);
7
- table.string('image').nullable();
8
- table.string('icon').nullable();
9
- table.string('color', 7).nullable();
10
- table.timestamps(true, true);
11
- })
12
- .createTable('brand_translations', table => {
13
- table.increments('brand_translation_id').primary();
14
- table.integer('brand_id').unsigned().references('brand_id').inTable('brands').onDelete('CASCADE');
15
- table.integer('language_id').unsigned().references('language_id').inTable('languages');
16
- table.string('name').notNullable();
17
- table.string('slug').notNullable();
18
- });
19
-
20
- exports.down = knex =>
21
- knex.schema
22
- .dropTable('brand_translations')
23
- .dropTable('brands');
@@ -1,30 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema
3
- .createTable('products', table => {
4
- table.increments('product_id').primary();
5
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
6
- table.integer('brand_id').unsigned().references('brand_id').inTable('brands');
7
- table.integer('category_id').unsigned().references('category_id').inTable('categories');
8
- table.integer('currency_id').unsigned().references('currency_id').inTable('currencies');
9
- table.integer('country_id').unsigned().references('country_id').inTable('countries');
10
- table.integer('tax_id').unsigned().references('tax_id').inTable('taxes');
11
- table.enum('product_type', ['physical', 'digital', 'service', 'third_party']).notNullable();
12
- table.boolean('is_active').defaultTo(true);
13
- table.timestamps(true, true);
14
- })
15
- .createTable('product_translations', table => {
16
- table.increments('product_translation_id').primary();
17
- table.integer('product_id').unsigned().references('product_id').inTable('products').onDelete('CASCADE');
18
- table.integer('language_id').unsigned().references('language_id').inTable('languages');
19
- table.string('title').notNullable();
20
- table.text('description');
21
- table.string('slug').notNullable();
22
- table.index(['title'], 'product_title_index', {
23
- type: 'fulltext'
24
- });
25
- });
26
-
27
- exports.down = knex =>
28
- knex.schema
29
- .dropTable('product_translations')
30
- .dropTable('products');
@@ -1,18 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('product_images', table => {
3
- table.increments('product_image_id').primary();
4
- table.integer('product_id').unsigned().references('product_id').inTable('products').onDelete('CASCADE');
5
- table.string('image_url').notNullable();
6
- table.boolean('is_main').defaultTo(false);
7
- table.integer('order').defaultTo(0);
8
- table.boolean('is_active').defaultTo(true);
9
- table.timestamps(true, true);
10
- table.index(['product_id'], 'product_image_product_index');
11
- table.index(['is_main'], 'product_image_is_main_index');
12
- table.index(['order'], 'product_image_order_index');
13
- table.index(['created_at'], 'product_image_created_at_index');
14
- table.index(['updated_at'], 'product_image_updated_at_index');
15
- });
16
-
17
- exports.down = knex =>
18
- knex.schema.dropTable('product_images');
@@ -1,30 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema
3
- .createTable('option_types', table => {
4
- table.increments('option_type_id').primary();
5
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
6
- table.string('code').unique();
7
- })
8
- .createTable('option_type_translations', table => {
9
- table.increments('option_type_translation_id').primary();
10
- table.integer('option_type_id').unsigned().references('option_type_id').inTable('option_types').onDelete('CASCADE');
11
- table.integer('language_id').unsigned().references('language_id').inTable('languages');
12
- table.string('name').notNullable();
13
- })
14
- .createTable('option_values', table => {
15
- table.increments('option_value_id').primary();
16
- table.integer('option_type_id').unsigned().references('option_type_id').inTable('option_types').onDelete('CASCADE');
17
- })
18
- .createTable('option_value_translations', table => {
19
- table.increments('option_value_translation_id').primary();
20
- table.integer('option_value_id').unsigned().references('option_value_id').inTable('option_values').onDelete('CASCADE');
21
- table.integer('language_id').unsigned().references('language_id').inTable('languages');
22
- table.string('value').notNullable();
23
- });
24
-
25
- exports.down = knex =>
26
- knex.schema
27
- .dropTable('option_value_translations')
28
- .dropTable('option_values')
29
- .dropTable('option_type_translations')
30
- .dropTable('option_types');
@@ -1,23 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema
3
- .createTable('product_variants', table => {
4
- table.increments('product_variant_id').primary();
5
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
6
- table.integer('product_id').unsigned().references('product_id').inTable('products').onDelete('CASCADE');
7
- table.string('sku').unique();
8
- table.decimal('price', 10, 2);
9
- table.decimal('discount_price', 10, 2);
10
- table.integer('stock').defaultTo(0);
11
- })
12
- .createTable('product_variant_options', table => {
13
- table.increments('product_variant_option_id').primary();
14
- table.integer('product_variant_id').unsigned().references('product_variant_id').inTable('product_variants').onDelete('CASCADE');
15
- table.integer('option_value_id').unsigned().references('option_value_id').inTable('option_values').onDelete('CASCADE');
16
- table.integer('option_type_id').unsigned().references('option_type_id').inTable('option_types').onDelete('CASCADE');
17
- table.decimal('variant_price', 16, 2).defaultTo(0);
18
- });
19
-
20
- exports.down = knex =>
21
- knex.schema
22
- .dropTable('product_variant_options')
23
- .dropTable('product_variants');
@@ -1,25 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema
3
- .createTable('attributes', table => {
4
- table.increments('attribute_id').primary();
5
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
6
- table.integer('category_id').unsigned().references('category_id').inTable('categories').onDelete('CASCADE');
7
- })
8
- .createTable('attribute_translations', table => {
9
- table.increments('attribute_translation_id').primary();
10
- table.integer('attribute_id').unsigned().references('attribute_id').inTable('attributes').onDelete('CASCADE');
11
- table.integer('language_id').unsigned().references('language_id').inTable('languages');
12
- table.string('name').notNullable();
13
- })
14
- .createTable('product_attributes', table => {
15
- table.increments('product_attribute_id').primary();
16
- table.integer('product_id').unsigned().references('product_id').inTable('products').onDelete('CASCADE');
17
- table.integer('attribute_id').unsigned().references('attribute_id').inTable('attributes').onDelete('CASCADE');
18
- table.string('value').notNullable();
19
- });
20
-
21
- exports.down = knex =>
22
- knex.schema
23
- .dropTable('product_attributes')
24
- .dropTable('attribute_translations')
25
- .dropTable('attributes');
@@ -1,15 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('discounts', table => {
3
- table.increments('discount_id').primary();
4
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
5
- table.enum('type', ['global', 'category']);
6
- table.integer('brand_id').unsigned().nullable().references('brand_id').inTable('brands');
7
- table.integer('category_id').unsigned().nullable().references('category_id').inTable('categories');
8
- table.decimal('percentage', 5, 2).defaultTo(0);
9
- table.decimal('amount', 16, 2).defaultTo(0);
10
- table.date('start_date');
11
- table.date('end_date');
12
- });
13
-
14
- exports.down = knex =>
15
- knex.schema.dropTable('discounts');
@@ -1,22 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema
3
- .createTable('reviews', table => {
4
- table.increments('review_id').primary();
5
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
6
- table.integer('product_id').unsigned().references('product_id').inTable('products').onDelete('CASCADE');
7
- table.integer('user_id').unsigned().references('user_id').inTable('users');
8
- table.integer('rating').defaultTo(0);
9
- table.text('comment');
10
- table.boolean('is_approved').defaultTo(false);
11
- table.timestamps(true, true);
12
- })
13
- .createTable('review_images', table => {
14
- table.increments('review_image_id').primary();
15
- table.integer('review_id').unsigned().references('review_id').inTable('reviews').onDelete('CASCADE');
16
- table.string('image_url').notNullable();
17
- });
18
-
19
- exports.down = knex =>
20
- knex.schema
21
- .dropTable('review_images')
22
- .dropTable('reviews');
@@ -1,10 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('favorites', table => {
3
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
4
- table.integer('user_id').unsigned().references('user_id').inTable('users').onDelete('CASCADE');
5
- table.integer('product_id').unsigned().references('product_id').inTable('products').onDelete('CASCADE');
6
- table.primary(['site_id', 'user_id', 'product_id']);
7
- });
8
-
9
- exports.down = knex =>
10
- knex.schema.dropTable('favorites');
@@ -1,17 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('search_logs', table => {
3
- table.increments('search_log_id').primary();
4
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
5
- table.integer('user_id').unsigned().references('user_id').inTable('users');
6
- table.string('keyword').notNullable();
7
- table.integer('search_count').defaultTo(1);
8
- table.timestamp('last_searched_at').notNullable();
9
- table.timestamps(true, true);
10
- table.index(['site_id'], 'search_log_site_index');
11
- table.index(['user_id'], 'search_log_user_index');
12
- table.index(['keyword'], 'search_log_keyword_index');
13
- table.index(['last_searched_at'], 'search_log_last_searched_at_index');
14
- });
15
-
16
- exports.down = knex =>
17
- knex.schema.dropTable('search_logs');
@@ -1,16 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('orders', table => {
3
- table.increments('order_id').primary();
4
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
5
- table.integer('user_id').nullable().unsigned().references('user_id').inTable('users');
6
- table.string('order_number').unique().notNullable();
7
- table.decimal('subtotal', 10, 2).notNullable();
8
- table.decimal('discount_total', 10, 2).defaultTo(0);
9
- table.decimal('shipping_total', 10, 2).defaultTo(0);
10
- table.decimal('grand_total', 10, 2).notNullable();
11
-
12
- table.timestamps(true, true);
13
- });
14
-
15
- exports.down = knex =>
16
- knex.schema.dropTable('orders');
@@ -1,19 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('order_items', table => {
3
- table.increments('order_item_id').primary();
4
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
5
- table.integer('order_id').unsigned().references('order_id').inTable('orders').onDelete('CASCADE');
6
- table.integer('product_id').unsigned().nullable().references('product_id').inTable('products');
7
- table.integer('product_variant_id').unsigned().nullable().references('product_variant_id').inTable('product_variants');
8
- table.integer('currency_id').unsigned().nullable().references('currency_id').inTable('currencies');
9
- table.integer('discount_id').unsigned().nullable().references('discount_id').inTable('discounts');
10
- table.integer('tax_id').unsigned().nullable().references('tax_id').inTable('taxes');
11
- table.decimal('unit_price', 10, 2).notNullable();
12
- table.decimal('discount_price', 10, 2).nullable();
13
- table.integer('quantity').notNullable();
14
- table.decimal('total_price', 10, 2).notNullable();
15
- table.timestamps(true, true);
16
- });
17
-
18
- exports.down = knex =>
19
- knex.schema.dropTable('order_items');
@@ -1,10 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('order_statuses', table => {
3
- table.increments('order_status_id').primary();
4
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
5
- table.string('code').unique().notNullable();
6
- table.boolean('is_default').defaultTo(false);
7
- });
8
-
9
- exports.down = knex =>
10
- knex.schema.dropTable('order_statuses');
@@ -1,13 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('order_payments', table => {
3
- table.increments('order_payment_id').primary();
4
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
5
- table.integer('order_id').unsigned().references('order_id').inTable('orders').onDelete('CASCADE');
6
- table.integer('order_status_id').unsigned().references('order_status_id').inTable('order_statuses');
7
- table.integer('payment_method_id').unsigned().references('payment_method_id').inTable('payment_methods');
8
- table.decimal('amount', 10, 2).notNullable();
9
- table.timestamps(true, true);
10
- });
11
-
12
- exports.down = knex =>
13
- knex.schema.dropTable('order_payments');
@@ -1,23 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('order_addresses', table => {
3
- table.increments('order_address_id').primary();
4
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
5
- table.integer('order_id').unsigned().references('order_id').inTable('orders').onDelete('CASCADE');
6
- table.enum('type', ['billing', 'shipping']).notNullable();
7
-
8
- table.string('full_name');
9
- table.string('phone');
10
- table.string('country');
11
- table.string('city');
12
- table.string('district');
13
- table.text('address');
14
- table.string('postal_code');
15
-
16
- table.string('tax_number');
17
- table.string('tax_office');
18
-
19
- table.timestamps(true, true);
20
- });
21
-
22
- exports.down = knex =>
23
- knex.schema.dropTable('order_addresses');
@@ -1,13 +0,0 @@
1
- exports.up = knex =>
2
- knex.schema.createTable('order_status_logs', table => {
3
- table.increments('order_status_log_id').primary();
4
- table.integer('site_id').unsigned().references('site_id').inTable('sites');
5
- table.integer('order_id').unsigned().references('order_id').inTable('orders').onDelete('CASCADE');
6
- table.integer('status_id').unsigned().references('order_status_id').inTable('order_statuses');
7
- table.integer('changed_by').unsigned().nullable().references('admin_id').inTable('admins');
8
- table.text('note');
9
- table.timestamps(true, true);
10
- });
11
-
12
- exports.down = knex =>
13
- knex.schema.dropTable('order_status_logs');
@@ -1,37 +0,0 @@
1
- /**
2
- * Seed the admins table with a default admin user.
3
- * @param { import("knex").Knex } knex
4
- */
5
- const bcrypt = require('bcryptjs');
6
-
7
- exports.seed = async function(knex) {
8
- // Hash the password using bcrypt
9
- const hashedPassword = await bcrypt.hash('123123', 10);
10
-
11
- // Inserts a default admin user
12
- await knex('admins').insert([
13
- {
14
- firstname: 'Admin',
15
- lastname: 'Admin',
16
- username: 'admin',
17
- email: 'admin@admin.com',
18
- password: hashedPassword,
19
- role: 'admin',
20
- two_factor_enabled: true,
21
- two_factor_secret: 'WZVMTNVU4JZAXHAKSYJIKN7S2IRAZSS5',
22
- is_active: true
23
- },
24
- {
25
- firstname: 'Support',
26
- lastname: 'Support',
27
- username: 'support',
28
- email: 'support@support.com',
29
- password: hashedPassword,
30
- role: 'support',
31
- two_factor_enabled: true,
32
- two_factor_secret: 'WZVMTNVU4JZAXHAKSYJIKN7S2IRAZSS5',
33
- is_active: true
34
- }
35
- ]).onConflict('username').merge();
36
- };
37
-