142 Commits

Author SHA1 Message Date
931840c243 Merge pull request 'expand orders' (#75) from expand_orders into main
Reviewed-on: #75
2026-04-16 14:25:59 +00:00
Daniel Goc
d73dad8975 merge and small bugfix 2026-04-16 15:02:38 +02:00
Daniel Goc
7995177fe1 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into expand_orders 2026-04-16 15:01:45 +02:00
70e0e23ace Merge pull request 'feat: implement logger' (#74) from logger into main
Reviewed-on: #74
Reviewed-by: goc_daniel <goc_daniel@ma-al.com>
2026-04-16 13:00:47 +00:00
9961d90fa7 feat: implement logger 2026-04-16 14:46:09 +02:00
Daniel Goc
f435a8839b expand orders 2026-04-16 11:47:55 +02:00
7bce04e05a Merge pull request 'is_oem' (#72) from is_oem into main
Reviewed-on: #72
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-15 11:32:43 +00:00
9a90de3f11 Merge pull request 'no-vat-customers' (#71) from no-vat-customers into main
Reviewed-on: #71
2026-04-15 11:32:13 +00:00
Daniel Goc
754bf2fe01 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into is_oem 2026-04-15 13:20:26 +02:00
Daniel Goc
2ca07f03ce expanded by is_oem 2026-04-15 13:19:28 +02:00
6efb39edf7 Merge branch 'no-vat-customers' of ssh://git.ma-al.com:8822/goc_daniel/b2b into no-vat-customers 2026-04-15 12:58:37 +02:00
e9af4bf311 feat: add no vat customers logic 2026-04-15 12:58:23 +02:00
cc570cc6a8 Merge branch 'main' into no-vat-customers 2026-04-15 10:57:16 +00:00
1bf706dcd0 feat: add no vat customers logic 2026-04-15 12:55:14 +02:00
84b4c70ffb Merge pull request 'bugfix' (#70) from countries_bugfix into main
Reviewed-on: #70
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-15 10:00:41 +00:00
Daniel Goc
2fd9472db1 bugfix 2026-04-15 11:48:29 +02:00
66df535317 Merge pull request 'expand_carts' (#69) from expand_carts into main
Reviewed-on: #69
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-15 09:19:16 +00:00
e31ecda582 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into no-vat-customers 2026-04-15 11:14:40 +02:00
Daniel Goc
e0a86febc4 add missing permission 2026-04-14 15:52:45 +02:00
Daniel Goc
40154ec861 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into expand_carts 2026-04-14 15:43:44 +02:00
Daniel Goc
bb507036db change add-product endpoint + remove-product 2026-04-14 15:42:30 +02:00
80a1314dc0 Merge pull request 'some small fixes' (#68) from small_fixes into main
Reviewed-on: #68
2026-04-14 13:16:17 +00:00
Daniel Goc
100a9f57d4 some small fixes 2026-04-14 14:08:57 +02:00
773e7d3c20 Merge pull request 'feat: lookup by id in customer search' (#61) from cust-search into main
Reviewed-on: #61
2026-04-14 11:42:56 +00:00
8e063978a8 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into no-vat-customers 2026-04-14 13:40:37 +02:00
03a0e5ea64 Merge branch 'main' into cust-search 2026-04-14 11:39:18 +00:00
ce8c19f715 Merge pull request 'feat: make routing per role, add unlogged role' (#67) from routing-per-role into main
Reviewed-on: #67
Reviewed-by: goc_daniel <goc_daniel@ma-al.com>
2026-04-14 11:39:13 +00:00
31a2744131 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into no-vat-customers 2026-04-14 13:36:11 +02:00
4edcb0a852 Merge branch 'main' into cust-search 2026-04-14 11:22:00 +00:00
a4120dafa2 Merge branch 'main' into routing-per-role 2026-04-14 11:21:53 +00:00
5e1a8e898c Merge pull request 'orders' (#58) from orders into main
Reviewed-on: #58
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-14 11:20:05 +00:00
Daniel Goc
c610ce38cc fixes after merging with main 2026-04-14 13:19:48 +02:00
8e3e41d6fe Merge branch 'main' into cust-search 2026-04-14 11:16:42 +00:00
b33da9d072 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into routing-per-role 2026-04-14 13:15:51 +02:00
Daniel Goc
604247b7c8 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into orders 2026-04-14 13:14:52 +02:00
f55d59a0fd feat: add no vat property to customers 2026-04-14 13:12:21 +02:00
e5988a85f3 Merge pull request 'update_categories' (#62) from update_categories into main
Reviewed-on: #62
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-14 10:35:28 +00:00
Daniel Goc
0cb5cc47bb Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into update_categories 2026-04-14 12:33:11 +02:00
Daniel Goc
1efc5417be permissions strings change 2026-04-14 12:32:24 +02:00
Daniel Goc
a0c3dd8ec8 added filtering on is_new and is_favorite 2026-04-14 12:28:39 +02:00
ab783b599d chore: add favorite field to base product query 2026-04-14 11:07:55 +02:00
d173af29fe fix: actually add the unlogged role to migration 2026-04-14 10:18:12 +02:00
f14d60d67b chore: swap permission string in handler to consts 2026-04-14 10:17:05 +02:00
967b101f9b feat: make routing per role, add unlogged role 2026-04-14 09:54:37 +02:00
97ca510b99 Merge branch 'main' into cust-search 2026-04-14 06:26:47 +00:00
26cbdeec0a Merge pull request 'product-procedures' (#59) from product-procedures into main
Reviewed-on: #59
Reviewed-by: goc_daniel <goc_daniel@ma-al.com>
2026-04-13 13:32:28 +00:00
Daniel Goc
ce4cadaa16 most importantly: new category and filter on is_new 2026-04-13 15:29:21 +02:00
Daniel Goc
7f05d39b38 Merge branch 'product-procedures' of ssh://git.ma-al.com:8822/goc_daniel/b2b into update_categories 2026-04-13 14:48:28 +02:00
83b7cd49dd feat: lookup by id in customer search 2026-04-13 14:43:18 +02:00
Daniel Goc
88255776f3 fixes 2026-04-13 14:29:36 +02:00
38cb07f3d4 chore: address pull request review issues 2026-04-13 14:22:14 +02:00
Daniel Goc
1f6d5ecb72 go routine and removing cart 2026-04-13 09:21:33 +02:00
2e61cde742 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-04-10 15:26:36 +02:00
Daniel Goc
d4d55e2757 send email when creating new order 2026-04-10 15:17:29 +02:00
54608410ea feat: create specific price system and adapt product queries 2026-04-10 15:04:34 +02:00
Daniel Goc
80d26bba12 GET -> POST 2026-04-10 14:57:24 +02:00
Daniel Goc
33e9d016e9 basic orders are ready 2026-04-10 14:53:40 +02:00
Daniel Goc
a03a2b461f small fix 2026-04-10 13:25:00 +02:00
Daniel Goc
134bc4ea53 code ready, time for testing... 2026-04-10 13:23:51 +02:00
Daniel Goc
8595969c6e Find is done 2026-04-10 12:17:52 +02:00
Daniel Goc
a6aa06faa0 basic setup 2026-04-10 11:17:58 +02:00
Daniel Goc
4f4b32b131 order struct 2026-04-10 11:06:43 +02:00
Daniel Goc
dfdf8b4db9 orders handler init 2026-04-10 11:01:39 +02:00
Daniel Goc
438a13c04c orders tables 2026-04-10 10:34:44 +02:00
8024d9f739 Merge pull request 'favorites' (#57) from favorites into main
Reviewed-on: #57
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-10 08:09:13 +00:00
Daniel Goc
c5832c0cf5 minor change 2026-04-10 09:57:07 +02:00
Daniel Goc
61ccd32c4a catching errors again 2026-04-10 09:43:49 +02:00
Daniel Goc
f7f56c2928 catching errors 2026-04-10 09:33:44 +02:00
Daniel Goc
0a5ce5d9c2 ... 2026-04-10 09:13:13 +02:00
Daniel Goc
f1f5daa82b and add filtering by is_favorite 2026-04-09 14:53:56 +02:00
Daniel Goc
393de36cb2 favorites 2026-04-09 14:49:50 +02:00
9fb8e034fc Merge pull request 'added addresses endpoints' (#55) from addresses into main
Reviewed-on: #55
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-09 10:37:36 +00:00
Daniel Goc
1083ab7a61 added addresses endpoints 2026-04-09 12:21:56 +02:00
75af44b0df feat: product_attribute list with prices 2026-04-09 09:51:06 +02:00
75997ab15b Merge pull request 'storage' (#46) from storage into main
Reviewed-on: #46
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-08 13:58:22 +00:00
Daniel Goc
569a805a13 small fix 2026-04-08 13:23:05 +02:00
Daniel Goc
578d8c6cac merged with current main 2026-04-08 13:20:07 +02:00
Daniel Goc
cbd0baaa50 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into storage 2026-04-08 13:19:45 +02:00
Daniel Goc
7eee0bd032 rebuilt storage 2026-04-08 13:09:19 +02:00
92ba9c5f07 Merge pull request 'feat: searching on customer list' (#54) from product-procedures into main
Reviewed-on: #54
2026-04-08 07:58:55 +00:00
a121ddc246 Merge branch 'main' into product-procedures 2026-04-07 14:00:27 +00:00
d56650ae5d feat: searching on customer list 2026-04-07 14:42:56 +02:00
1a6311dc3d Merge pull request 'fix: google provider auth' (#53) from product-procedures into main
Reviewed-on: #53
2026-04-07 11:39:08 +00:00
2e645f3368 fix: google provider auth 2026-04-07 13:36:43 +02:00
de3f2d1777 Merge pull request 'product-procedures' (#52) from product-procedures into main
Reviewed-on: #52
Reviewed-by: Marek Goc <goc_marek@ma-al.com>
2026-04-07 08:45:15 +00:00
9187297367 refactor: move lists to their representative repos 2026-04-07 10:32:30 +02:00
813d1f4879 feat: add customer list, modify pagination utils 2026-04-07 09:28:39 +02:00
c5cc4f7a48 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-04-03 15:58:40 +02:00
76ca2a2eed chore: adapt code to new teleport feature 2026-04-03 15:58:35 +02:00
84388792f0 Merge pull request 'sanitize and save URL slugs' (#51) from translate_new_field into main
Reviewed-on: #51
Reviewed-by: Arina Yakovenko <yakovenko_arina@ma-al.com>
2026-04-03 13:15:32 +00:00
Daniel Goc
7264a11ba6 sanitize and save URL slugs 2026-04-03 14:58:50 +02:00
61dc240c38 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-04-03 14:37:58 +02:00
Daniel Goc
f6b321b602 a few fixes for user teleportation 2026-04-03 13:55:57 +02:00
Daniel Goc
af91842b14 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into storage 2026-04-03 13:29:06 +02:00
04e238fd66 Merge pull request 'user_teleport' (#50) from user_teleport into main
Reviewed-on: #50
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-03 11:27:11 +00:00
Daniel Goc
e0c53c97ba Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into user_teleport 2026-04-03 13:01:37 +02:00
09a77c14c9 Merge pull request 'add image link (large_default) to product description' (#49) from add_image_link into main
Reviewed-on: #49
Reviewed-by: Wiktor Dudzic <dudzic_wiktor@ma-al.com>
2026-04-03 10:58:21 +00:00
Daniel Goc
c7533a8deb add image link (large_default) to product description 2026-04-03 12:24:05 +02:00
Daniel Goc
1bab7f642f typo 2026-04-03 11:44:15 +02:00
Daniel Goc
a988bbbc33 added copying and moving 2026-04-03 11:25:16 +02:00
701004d005 chore: add bruno endpoints 2026-04-03 09:40:30 +02:00
c31964c41b Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-04-03 08:42:56 +02:00
0ed9d792b6 feat: roles, permissions 2026-04-02 15:06:00 +02:00
Daniel Goc
395d670298 add storage to .gitignore 2026-04-02 14:00:58 +02:00
Daniel Goc
7d4242abb1 move path to params 2026-04-02 13:52:50 +02:00
Daniel Goc
9c7eb5ee4e Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into storage 2026-04-02 11:31:39 +02:00
Daniel Goc
833f4a5a07 deleting and uploading files 2026-04-02 11:26:58 +02:00
Daniel Goc
b9bc121d43 getting to upload 2026-04-02 10:27:14 +02:00
Daniel Goc
b2acb8c922 storage 2026-04-01 13:30:54 +02:00
cf4d14a3cb Merge pull request 'front-styles' (#44) from front-styles into main
Reviewed-on: #44
2026-04-01 07:32:26 +00:00
30eb82ba53 fix: categories 2026-04-01 09:10:38 +02:00
a2a2c35ab3 Merge remote-tracking branch 'origin' into front-styles 2026-04-01 09:10:18 +02:00
Daniel Goc
03f04b2f53 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into user_teleport 2026-03-31 16:57:44 +02:00
Daniel Goc
55da953f32 add teleporting 2026-03-31 16:56:05 +02:00
684f910090 Merge pull request 'expand_get_menu' (#42) from expand_get_menu into main
Reviewed-on: #42
Reviewed-by: Marek Goc <goc_marek@ma-al.com>
2026-03-31 14:55:35 +00:00
5feaa9e15c Merge remote-tracking branch 'origin/expand_get_menu' into front-styles 2026-03-31 14:34:14 +02:00
Daniel Goc
04e2549a66 missing / in ImageLink 2026-03-31 14:30:47 +02:00
6428ddb527 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-03-31 13:42:27 +02:00
fb4f7048ab fix: requests 2026-03-31 12:44:02 +02:00
Daniel Goc
a3f01eca7c misspell fix 2026-03-31 12:27:31 +02:00
Daniel Goc
1fa6206b75 update openapi and add the exists_in_database flag to get-product 2026-03-31 12:00:30 +02:00
Daniel Goc
fa89723eb6 add get-breadcrumb endpoint 2026-03-31 11:40:57 +02:00
Daniel Goc
8665c566ee added new category error, and some fixes 2026-03-31 10:52:36 +02:00
ec5ff123ac Merge pull request 'front-styles' (#38) from front-styles into main
Reviewed-on: #38
2026-03-31 07:30:33 +00:00
17317e778c Merge remote-tracking branch 'origin' into front-styles 2026-03-31 09:19:06 +02:00
94291ccc03 Merge pull request 'improved JWTToken update, added list-users endpoint, debug of getCountries' (#37) from list_users into main
Reviewed-on: #37
Reviewed-by: Marek Goc <goc_marek@ma-al.com>
2026-03-31 07:08:15 +00:00
91c5de1f67 fix: menu and routing 2026-03-30 16:39:14 +02:00
Daniel Goc
d0ce65c287 improved JWTToken update, added list-users endpoint, debug of getCountries 2026-03-30 16:19:26 +02:00
05bfa6e8b8 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-03-30 15:17:53 +02:00
68f4850445 'routing, searching, fixes' 2026-03-30 01:04:25 +02:00
9ec329b1d6 fix products listing 2026-03-30 01:02:02 +02:00
f4ad8e02b4 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-03-27 08:47:41 +01:00
ec05101037 fix meilisearch 2026-03-27 02:03:26 +01:00
29260080c2 Merge pull request 'fix top menu embeding struct' (#34) from routing into main
Reviewed-on: #34
2026-03-26 17:44:08 +00:00
9336cdfa28 fix top menu embeding struct 2026-03-26 18:43:23 +01:00
bd97ed1a3b feat: creat main products query 2026-03-26 15:59:13 +01:00
396e25b750 Merge pull request 'fix: routing/data table' (#33) from front-styles into main
Reviewed-on: #33
Reviewed-by: Marek Goc <goc_marek@ma-al.com>
2026-03-26 14:57:40 +00:00
df14eb5ae4 Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-03-26 15:57:21 +01:00
f5d524d45b Merge branch 'main' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-03-26 11:46:37 +01:00
78bdac8ff0 Merge branch 'product-procedures' of ssh://git.ma-al.com:8822/goc_daniel/b2b into product-procedures 2026-03-26 10:07:15 +01:00
2c128a4b36 feat: create procedure for retrieving products 2026-03-25 08:38:05 +01:00
dd806bbb1e feat: create procedure for retrieving products 2026-03-19 15:44:42 +01:00
612 changed files with 19165 additions and 5227 deletions

11
.env
View File

@@ -48,6 +48,10 @@ EMAIL_FROM=test@ma-al.com
EMAIL_FROM_NAME=Gitea Manager
EMAIL_ADMIN=goc_marek@ma-al.pl
# STORAGE
STORAGE_ROOT=./storage
I18N_LANGS=en,pl,cs
PDF_SERVER_URL=http://localhost:8000
@@ -57,4 +61,9 @@ FILE_MAAL_PL_USER=git_operator
FILE_MAAL_PL_PASSWORD=1FnwqcEgIUjQHjt1
IMAGE_PREFIX=https://www.naluconcept.com # remove prefix to serv them from same host as presta
CORS_ORGIN=https://www.naluconcept.com
CORS_ORGIN=https://www.naluconcept.com
DSN=root:Maal12345678@tcp(localhost:3306)/nalu
LOG_LEVEL=warn
LOG_COLORIZE=true

4
.gitignore vendored
View File

@@ -5,4 +5,6 @@ bin/
i18n/*.json
*_templ.go
tmp/main
test.go
test.go
storage/*
!storage/.gitkeep

14
.vscode/launch.json vendored Normal file
View File

@@ -0,0 +1,14 @@
{
"version": "0.2.0",
"configurations": [
{
"name": "Launch Package",
"type": "go",
"request": "launch",
"mode": "auto",
"program": "./app/cmd/main.go",
"cwd": "${workspaceFolder}",
"envFile": "${workspaceFolder}/.env"
}
]
}

View File

@@ -2,7 +2,7 @@
"openapi": "3.0.3",
"info": {
"title": "b2b API",
"description": "Authentication, user management, and repository time tracking API\n\n## Filter Operators\nAll filter parameters support the following operators by adding a suffix to the parameter name:\n\n| Suffix | Operator | Example |\n|--------|----------|---------|\n| `_eq` | equals | `product_id_eq=12` |\n| `_neq` | not equals | `active_neq=0` |\n| `_gt` | greater than | `price_gt=100` |\n| `_gte` | greater than or equal | `price_gte=10` |\n| `_lt` | less than | `price_lt=500` |\n| `_lte` | less than or equal | `price_lte=500` |\n| `_in` | IN (comma-separated) | `product_id_in=1,2,3,4` |\n\n## Special Filters\n\n| Parameter | Example | Description |\n|-----------|---------|-------------|\n| `name=~text` | `name=~gold` | LIKE search (case-insensitive partial match) |\n| `price=[min,max]` | `price=[100,500]` | BETWEEN range (inclusive) |\n| `sort=field,direction` | `sort=price,desc` | ORDER BY clause (direction: asc/desc, default: desc) |\n| `p` | `p=1` | Page number (1-based, default: 1) |\n| `elems` | `elems=30` | Elements per page (max: 100, default: 30) |",
"description": "Authentication, user management, and repository time tracking API\n\n## Filtering\nAll filter parameters support the following operators by adding a suffix to the parameter name:\n\n### Comparison Operators\n\n| Suffix | Operator | Example | Description |\n|--------|----------|---------|-------------|\n| `_eq` | = | `product_id_eq=12` | Equals |\n| `_neq` | != | `active_neq=0` | Not equals |\n| `_gt` | > | `price_gt=100` | Greater than |\n| `_gte` | >= | `price_gte=10` | Greater than or equal |\n| `_lt` | < | `price_lt=500` | Less than |\n| `_lte` | <= | `price_lte=500` | Less than or equal |\n| `_in` | IN | `product_id_in=1,2,3,4` | IN clause (comma-separated values) |\n\n### Special Filters\n\n| Filter | Example | Description |\n|--------|---------|-------------|\n| `~` prefix | `name=~gold` | LIKE search - case-insensitive partial match on string values |\n| `[min,max]` | `price=[100,500]` | BETWEEN range - filters values between min and max (inclusive) |\n| `sort` | `sort=price,desc` | ORDER BY clause - field name and direction (asc/desc, default: desc) |\n| `p` | `p=1` | Page number - 1-based pagination (default: 1) |\n| `elems` | `elems=30` | Elements per page - results per page (max: 100, default: 30) |\n\n### Available Fields for Filtering\n\n**Products (`/api/v1/restricted/list-products/get-listing`):**\n\n| Field | Type | Example |\n|-------|------|---------|\n| `product_id` | integer | `product_id_eq=12`, `product_id_in=1,2,3` |\n| `name` | string | `name=~gold` (LIKE search) |\n| `reference` | string | `reference=ABC123` |\n| `category_name` | string | `category_name=~electronics` |\n| `id_category` | integer | `id_category_eq=5`, `id_category_in=1,2,3` |\n| `quantity` | integer | `quantity_gt=0` |\n| `variants_number` | integer | `variants_number_gte=1` |",
"version": "1.0.0",
"contact": {
"name": "API Support",
@@ -42,7 +42,7 @@
},
{
"name": "Search",
"description": "MeiliSearch endpoints (under /api/v1/restricted/meili-search, requires authentication)"
"description": "MeiliSearch endpoints (under /api/v1/restricted/search, requires authentication)"
},
{
"name": "Locale",
@@ -585,6 +585,35 @@
}
}
},
"/api/v1/restricted/search/settings": {
"post": {
"tags": ["Search"],
"summary": "Get MeiliSearch settings",
"description": "Returns MeiliSearch index configuration and settings. Requires authentication.",
"operationId": "getMeiliSearchSettings",
"security": [
{
"CookieAuth": [],
"BearerAuth": []
}
],
"responses": {
"200": {
"description": "Settings retrieved successfully"
},
"401": {
"description": "Not authenticated",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/api/v1/public/auth/me": {
"get": {
"tags": ["Auth"],
@@ -593,7 +622,8 @@
"operationId": "getMe",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"responses": {
@@ -633,7 +663,8 @@
"operationId": "updateChoice",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"responses": {
@@ -788,18 +819,19 @@
"get": {
"tags": ["Products"],
"summary": "Get product listing",
"description": "Returns a paginated list of products with their basic information. Supports filtering via query parameters with operators (e.g., product_id_eq=12, name=~wałek). Use sort parameter for ordering. Requires authentication.",
"description": "Returns a paginated list of products with their basic information. Supports filtering via query parameters with operators (e.g., product_id_eq=12, name=~wałek, quantity_gt=0). Use sort parameter for ordering. Requires authentication.\n\n### Filterable Fields\n- `product_id` - Product ID (integer)\n- `name` - Product name (string, supports LIKE with ~ prefix)\n- `reference` - Product reference (string)\n- `category_name` - Category name (string, supports LIKE with ~ prefix)\n- `id_category` - Category ID (integer)\n- `quantity` - Stock quantity (integer)\n- `variants_number` - Number of variants (integer)\n\n### Example Requests\n```\nGET /api/v1/restricted/list-products/get-listing?product_id_eq=12\nGET /api/v1/restricted/list-products/get-listing?name=~wałek&sort=price,asc\nGET /api/v1/restricted/list-products/get-listing?quantity_gt=0&elems=50&p=2\n```",
"operationId": "getProductListing",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
{
"name": "p",
"in": "query",
"description": "Page number (1-based)",
"description": "Page number (1-based, default: 1)",
"required": false,
"schema": {
"type": "integer",
@@ -819,66 +851,12 @@
{
"name": "sort",
"in": "query",
"description": "Sort field and direction. Format: field,direction (e.g., 'product_id,desc' or 'name,asc')",
"description": "Sort order: field,direction (direction: asc/desc, default: desc). Sortable fields: product_id, name, reference, category_name, id_category, quantity, variants_number",
"required": false,
"schema": {
"type": "string",
"example": "product_id,desc"
}
},
{
"name": "product_id",
"in": "query",
"description": "Filter by product ID. Use suffix _eq, _gt, _gte, _lt, _lte, _neq, _in for operators.",
"required": false,
"schema": {
"type": "integer"
}
},
{
"name": "name",
"in": "query",
"description": "Filter by product name using LIKE (case-insensitive). Use ~ prefix for partial match (e.g., '~wałek')",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "reference",
"in": "query",
"description": "Filter by product reference using LIKE (case-insensitive)",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "id_category",
"in": "query",
"description": "Filter by category ID. Use suffix _eq, _gt, _gte, _lt, _lte, _neq, _in for operators.",
"required": false,
"schema": {
"type": "integer"
}
},
{
"name": "category_name",
"in": "query",
"description": "Filter by category name using LIKE (case-insensitive)",
"required": false,
"schema": {
"type": "string"
}
},
{
"name": "quantity",
"in": "query",
"description": "Filter by quantity. Use suffix _eq, _gt, _gte, _lt, _lte for operators.",
"required": false,
"schema": {
"type": "integer"
}
}
],
"responses": {
@@ -923,7 +901,8 @@
"operationId": "getProductDescription",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
@@ -990,7 +969,8 @@
"operationId": "saveProductDescription",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
@@ -1067,7 +1047,8 @@
"operationId": "translateProductDescription",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
@@ -1146,20 +1127,32 @@
}
}
},
"/api/v1/restricted/menu/get-menu": {
"/api/v1/restricted/menu/get-category-tree": {
"get": {
"tags": ["Menu"],
"summary": "Get menu structure",
"description": "Returns the menu structure for the current language. Requires authentication.",
"operationId": "getMenu",
"summary": "Get category tree",
"description": "Returns the category tree rooted at the given category ID for the current language. Requires authentication.",
"operationId": "getCategoryTree",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
{
"name": "root_category_id",
"in": "query",
"description": "Root category ID to build the tree from",
"required": true,
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "Menu retrieved successfully",
"description": "Category tree retrieved successfully",
"content": {
"application/json": {
"schema": {
@@ -1169,7 +1162,7 @@
}
},
"400": {
"description": "Invalid request",
"description": "Invalid request or root category not found",
"content": {
"application/json": {
"schema": {
@@ -1191,17 +1184,78 @@
}
}
},
"/api/v1/restricted/menu/get-routes": {
"/api/v1/restricted/menu/get-breadcrumb": {
"get": {
"tags": ["Menu"],
"summary": "Get breadcrumb",
"description": "Returns the breadcrumb path from the root category to the specified category for the current language. Requires authentication.",
"operationId": "getBreadcrumb",
"security": [
{
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
{
"name": "root_category_id",
"in": "query",
"description": "Root category ID (breadcrumb starting point)",
"required": true,
"schema": {
"type": "integer"
}
},
{
"name": "category_id",
"in": "query",
"description": "Target category ID (breadcrumb destination)",
"required": true,
"schema": {
"type": "integer"
}
}
],
"responses": {
"200": {
"description": "Breadcrumb retrieved successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiResponse"
}
}
}
},
"400": {
"description": "Invalid request, category not found, or root never reached",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"401": {
"description": "Not authenticated",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/api/v1/public/menu/get-routes": {
"get": {
"tags": ["Menu"],
"summary": "Get routes",
"description": "Returns the routing structure for the current language. Requires authentication.",
"description": "Returns the routing structure for the current language.",
"operationId": "getRoutes",
"security": [
{
"CookieAuth": []
}
],
"responses": {
"200": {
"description": "Routes retrieved successfully",
@@ -1222,16 +1276,6 @@
}
}
}
},
"401": {
"description": "Not authenticated",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
@@ -1244,7 +1288,8 @@
"operationId": "getTopMenu",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"responses": {
@@ -1253,7 +1298,23 @@
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiResponse"
"type": "object",
"properties": {
"message": {
"type": "string"
},
"items": {
"type": "array",
"items": {
"$ref": "#/components/schemas/B2BTopMenu"
},
"description": "Root menu items with nested children"
},
"count": {
"type": "integer",
"description": "Number of root menu items"
}
}
}
}
}
@@ -1281,81 +1342,35 @@
}
}
},
"/api/v1/restricted/meili-search/search": {
"get": {
"/api/v1/restricted/search/search": {
"post": {
"tags": ["Search"],
"summary": "Search products",
"description": "Searches products using MeiliSearch. Requires authentication.",
"description": "Searches products using MeiliSearch. Requires authentication. Request body should contain MeiliSearch search parameters.",
"operationId": "searchProducts",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
{
"name": "query",
"in": "query",
"description": "Search query string",
"required": true,
"schema": {
"type": "string"
}
},
{
"name": "limit",
"in": "query",
"description": "Maximum number of results",
"required": true,
"schema": {
"type": "integer",
"format": "uint"
}
},
{
"name": "id_category",
"in": "query",
"description": "Filter by category ID",
"required": false,
"schema": {
"type": "integer",
"format": "uint"
}
},
{
"name": "price_lower_bound",
"in": "query",
"description": "Lower price bound",
"required": false,
"schema": {
"type": "number",
"format": "double"
}
},
{
"name": "price_upper_bound",
"in": "query",
"description": "Upper price bound",
"required": false,
"schema": {
"type": "number",
"format": "double"
}
}
],
"responses": {
"200": {
"description": "Search results retrieved successfully",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiResponse"
}
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"description": "MeiliSearch search parameters (query, limit, filter, etc.)"
}
}
}
},
"responses": {
"200": {
"description": "Search results retrieved successfully"
},
"400": {
"description": "Invalid request parameters",
"description": "Invalid request body",
"content": {
"application/json": {
"schema": {
@@ -1377,7 +1392,7 @@
}
}
},
"/api/v1/restricted/meili-search/create-index": {
"/api/v1/restricted/search/create-index": {
"get": {
"tags": ["Search"],
"summary": "Create search index",
@@ -1385,7 +1400,8 @@
"operationId": "createSearchIndex",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"responses": {
@@ -1422,51 +1438,6 @@
}
}
},
"/api/v1/restricted/meili-search/test": {
"get": {
"tags": ["Search"],
"summary": "Test MeiliSearch",
"description": "Tests the MeiliSearch search. Must be removed before proper release.",
"operationId": "testMeiliSearch",
"security": [
{
"CookieAuth": []
}
],
"responses": {
"200": {
"description": "MeiliSearch test successful",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ApiResponse"
}
}
}
},
"400": {
"description": "Invalid request",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
},
"401": {
"description": "Not authenticated",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/Error"
}
}
}
}
}
}
},
"/api/v1/restricted/langs-and-countries/get-languages": {
"get": {
"tags": ["Locale"],
@@ -1475,7 +1446,8 @@
"operationId": "getAvailableLanguages",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"responses": {
@@ -1520,7 +1492,8 @@
"operationId": "getCountriesAndCurrencies",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"responses": {
@@ -1565,7 +1538,8 @@
"operationId": "addNewCart",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"responses": {
@@ -1600,7 +1574,8 @@
"operationId": "changeCartName",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
@@ -1665,7 +1640,8 @@
"operationId": "retrieveCartsInfo",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"responses": {
@@ -1700,7 +1676,8 @@
"operationId": "retrieveCart",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
@@ -1756,7 +1733,8 @@
"operationId": "addProductToCart",
"security": [
{
"CookieAuth": []
"CookieAuth": [],
"BearerAuth": []
}
],
"parameters": [
@@ -2110,46 +2088,6 @@
}
}
},
"MenuItem": {
"type": "object",
"description": "Menu item structure",
"properties": {
"category_id": {
"type": "integer",
"format": "uint",
"description": "Category ID"
},
"label": {
"type": "string",
"description": "Menu item label"
},
"params": {
"$ref": "#/components/schemas/MenuItemParams"
},
"children": {
"type": "array",
"items": {
"$ref": "#/components/schemas/MenuItem"
},
"description": "Child menu items"
}
}
},
"MenuItemParams": {
"type": "object",
"properties": {
"category_id": {
"type": "integer",
"format": "uint"
},
"link_rewrite": {
"type": "string"
},
"locale": {
"type": "string"
}
}
},
"Route": {
"type": "object",
"description": "Application route",
@@ -2453,6 +2391,58 @@
"description": "Build date in RFC3339 format"
}
}
},
"CategoryInBreadcrumb": {
"type": "object",
"description": "A single item in a category breadcrumb path",
"properties": {
"category_id": {
"type": "integer",
"format": "uint",
"description": "Category ID"
},
"name": {
"type": "string",
"description": "Category name"
}
}
},
"B2BTopMenu": {
"type": "object",
"description": "Top-level menu item for B2B back-office",
"properties": {
"menu_id": {
"type": "integer",
"description": "Menu item ID"
},
"label": {
"type": "object",
"description": "Menu label as JSON (multilingual, e.g. {\"en\": \"Dashboard\", \"pl\": \"Panel\"})"
},
"parent_id": {
"type": "integer",
"description": "Parent menu ID (null for root items)"
},
"params": {
"type": "object",
"description": "Menu item parameters as JSON"
},
"active": {
"type": "integer",
"description": "Active status (1 = active, 0 = inactive)"
},
"position": {
"type": "integer",
"description": "Sort position"
},
"children": {
"type": "array",
"items": {
"$ref": "#/components/schemas/B2BTopMenu"
},
"description": "Child menu items"
}
}
}
},
"securitySchemes": {

View File

@@ -4,8 +4,11 @@ import (
"log"
"os"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/delivery/web"
"git.ma-al.com/goc_daniel/b2b/app/service/langsService"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/version"
"github.com/spf13/cobra"
)
@@ -21,6 +24,8 @@ var (
return
}
logger.Init("b2b", nil, config.Get().Log.LogLevel, config.Get().Log.LogColorize)
// Create and setup the server
server := web.New()

View File

@@ -2,8 +2,10 @@ package config
import (
"fmt"
"log"
"log/slog"
"os"
"path/filepath"
"reflect"
"strconv"
"strings"
@@ -24,6 +26,9 @@ type Config struct {
GoogleTranslate GoogleTranslateConfig
Image ImageConfig
Cors CorsConfig
MeiliSearch MeiliSearchConfig
Storage StorageConfig
Log LogConfig
}
type I18n struct {
@@ -38,6 +43,11 @@ type CorsConfig struct {
Origins []string `env:"CORS_ORGIN"`
}
type MeiliSearchConfig struct {
ServerURL string `env:"MEILISEARCH_URL"`
ApiKey string `env:"MEILISEARCH_API_KEY"`
}
type ImageConfig struct {
ImagePrefix string `env:"IMAGE_PREFIX"`
}
@@ -78,6 +88,11 @@ type AppConfig struct {
BaseURL string `env:"APP_BASE_URL,http://localhost:5173"`
}
type LogConfig struct {
LogLevel string `env:"LOG_LEVEL,warn"`
LogColorize bool `env:"LOG_COLORIZE,true"`
}
type EmailConfig struct {
SMTPHost string `env:"EMAIL_SMTP_HOST,localhost"`
SMTPPort int `env:"EMAIL_SMTP_PORT,587"`
@@ -89,6 +104,10 @@ type EmailConfig struct {
Enabled bool `env:"EMAIL_ENABLED,false"`
}
type StorageConfig struct {
RootFolder string `env:"STORAGE_ROOT"`
}
type PdfPrinter struct {
ServerUrl string `env:"PDF_SERVER_URL,http://localhost:8000"`
}
@@ -149,7 +168,7 @@ func load() *Config {
err = loadEnv(&cfg.OAuth.Google)
if err != nil {
slog.Error("not possible to load env variables for outh google : ", err.Error(), "")
slog.Error("not possible to load env variables for oauth google : ", err.Error(), "")
}
err = loadEnv(&cfg.App)
@@ -164,12 +183,12 @@ func load() *Config {
err = loadEnv(&cfg.I18n)
if err != nil {
slog.Error("not possible to load env variables for email : ", err.Error(), "")
slog.Error("not possible to load env variables for i18n : ", err.Error(), "")
}
err = loadEnv(&cfg.Pdf)
if err != nil {
slog.Error("not possible to load env variables for email : ", err.Error(), "")
slog.Error("not possible to load env variables for pdf : ", err.Error(), "")
}
err = loadEnv(&cfg.GoogleTranslate)
@@ -179,13 +198,30 @@ func load() *Config {
err = loadEnv(&cfg.Image)
if err != nil {
slog.Error("not possible to load env variables for google translate : ", err.Error(), "")
slog.Error("not possible to load env variables for image : ", err.Error(), "")
}
err = loadEnv(&cfg.Cors)
if err != nil {
slog.Error("not possible to load env variables for google translate : ", err.Error(), "")
slog.Error("not possible to load env variables for cors : ", err.Error(), "")
}
err = loadEnv(&cfg.MeiliSearch)
if err != nil {
slog.Error("not possible to load env variables for meili search : ", err.Error(), "")
}
err = loadEnv(&cfg.Storage)
if err != nil {
slog.Error("not possible to load env variables for storage : ", err.Error(), "")
}
err = loadEnv(&cfg.Log)
if err != nil {
slog.Error("not possible to load env variables for logger : ", err.Error(), "")
}
cfg.Storage.RootFolder = ResolveRelativePath(cfg.Storage.RootFolder)
return cfg
}
@@ -296,6 +332,22 @@ func setValue(field reflect.Value, val string, key string) error {
return nil
}
func ResolveRelativePath(relativePath string) string {
// get working directory (where program was started)
wd, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
// convert to absolute path
absPath := relativePath
if !filepath.IsAbs(absPath) {
absPath = filepath.Join(wd, absPath)
}
return filepath.Clean(absPath)
}
func parseEnvTag(tag string) (key string, def *string) {
if tag == "" {
return "", nil

View File

@@ -7,6 +7,7 @@ import (
"git.ma-al.com/goc_daniel/b2b/app/config"
extraClausePlugin "github.com/WinterYukky/gorm-extra-clause-plugin"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"gorm.io/gorm/logger"
@@ -52,7 +53,10 @@ func newMySQLDB(cfg *config.DatabaseConfig) (*gorm.DB, error) {
sqlDB.SetConnMaxLifetime(cfg.ConnMaxLifetime)
log.Println("✓ Database connection established successfully")
err = db.Use(extraClausePlugin.New())
if err != nil {
panic(err)
}
return db, nil
}

View File

@@ -1,19 +1,24 @@
package middleware
import (
"encoding/base64"
"strconv"
"strings"
"time"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
"git.ma-al.com/goc_daniel/b2b/app/model"
"git.ma-al.com/goc_daniel/b2b/app/service/authService"
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"github.com/gofiber/fiber/v3"
)
// AuthMiddleware creates authentication middleware
func AuthMiddleware() fiber.Handler {
func Authenticate() fiber.Handler {
authService := authService.NewAuthService()
return func(c fiber.Ctx) error {
// Get token from Authorization header
authHeader := c.Get("Authorization")
@@ -21,17 +26,13 @@ func AuthMiddleware() fiber.Handler {
// Try to get from cookie
authHeader = c.Cookies("access_token")
if authHeader == "" {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "authorization token required",
})
return c.Next()
}
} else {
// Extract token from "Bearer <token>"
parts := strings.Split(authHeader, " ")
if len(parts) != 2 || parts[0] != "Bearer" {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "invalid authorization header format",
})
return c.Next()
}
authHeader = parts[1]
}
@@ -39,79 +40,147 @@ func AuthMiddleware() fiber.Handler {
// Validate token
claims, err := authService.ValidateToken(authHeader)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "invalid or expired token",
})
return c.Next()
}
// Get user from database
user, err := authService.GetUserByID(claims.UserID)
if err != nil {
return c.Next()
}
// Check if user is active
if !user.IsActive {
return c.Next()
}
// Create locale. LangID is overwritten by auth Token
var userLocale model.UserLocale
userLocale.OriginalUser = user
// Check if target user is present
targetUserIDAttribute := c.Query("target_user_id")
if targetUserIDAttribute == "" {
userLocale.User = user
c.Locals(constdata.USER_LOCALE, &userLocale)
return c.Next()
}
// We now populate the target user
if !userLocale.OriginalUser.HasPermission(perms.Teleport) {
return c.Next()
}
targetUserID, err := strconv.Atoi(targetUserIDAttribute)
if err != nil {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "invalid target user id attribute",
})
}
// to verify target user, we use the same functionality as for verifying original user
// Get target user from database
user, err = authService.GetUserByID(uint(targetUserID))
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "target user not found",
})
}
// Check if target user is active
if !user.IsActive {
return c.Status(fiber.StatusForbidden).JSON(fiber.Map{
"error": "target user account is inactive",
})
}
userLocale.User = user
c.Locals(constdata.USER_LOCALE, &userLocale)
return c.Next()
}
}
func Authorize() fiber.Handler {
return func(c fiber.Ctx) error {
_, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "not authenticated",
})
}
return c.Next()
}
}
// Webdav
func Webdav() fiber.Handler {
authService := authService.NewAuthService()
return func(c fiber.Ctx) error {
authHeader := c.Get("Authorization")
if authHeader == "" {
c.Set("WWW-Authenticate", `Basic realm="webdav"`)
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "authorization token required",
})
}
if !strings.HasPrefix(authHeader, "Basic ") {
c.Set("WWW-Authenticate", `Basic realm="webdav"`)
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "invalid authorization token",
})
}
encoded := strings.TrimPrefix(authHeader, "Basic ")
decoded, err := base64.StdEncoding.DecodeString(encoded)
if err != nil {
c.Set("WWW-Authenticate", `Basic realm="webdav"`)
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "invalid authorization token",
})
}
credentials := strings.SplitN(string(decoded), ":", 2)
rawToken := ""
if len(credentials) == 1 {
rawToken = credentials[0]
} else if len(credentials) == 2 {
rawToken = credentials[1]
}
if len(rawToken) != constdata.NBYTES_IN_WEBDAV_TOKEN*2 {
c.Set("WWW-Authenticate", `Basic realm="webdav"`)
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "invalid authorization token",
})
}
// we identify user based on this token.
user, err := authService.GetUserByWebdavToken(rawToken)
if err != nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "user not found",
})
}
// Check if user is active
if !user.IsActive {
return c.Status(fiber.StatusForbidden).JSON(fiber.Map{
"error": "user account is inactive",
})
}
// Set user in context
c.Locals("user", user.ToSession())
c.Locals("userID", user.ID)
return c.Next()
}
}
// RequireAdmin creates admin-only middleware
func RequireAdmin() fiber.Handler {
return func(c fiber.Ctx) error {
user := c.Locals("user")
if user == nil {
if user.WebdavExpires != nil && user.WebdavExpires.Before(time.Now()) {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": "not authenticated",
"error": "invalid or expired token",
})
}
userSession, ok := user.(*model.UserSession)
if !ok {
return c.Status(fiber.StatusInternalServerError).JSON(fiber.Map{
"error": "invalid user session",
})
}
if userSession.Role != model.RoleAdmin {
return c.Status(fiber.StatusForbidden).JSON(fiber.Map{
"error": "admin access required",
})
}
var userLocale model.UserLocale
userLocale.OriginalUser = user
userLocale.User = user
c.Locals(constdata.USER_LOCALE, &userLocale)
return c.Next()
}
}
// GetUserID extracts user ID from context
func GetUserID(c fiber.Ctx) uint {
userID, ok := c.Locals("userID").(uint)
if !ok {
return 0
}
return userID
}
// GetUser extracts user from context
func GetUser(c fiber.Ctx) *model.UserSession {
user, ok := c.Locals("user").(*model.UserSession)
if !ok {
return nil
}
return user
}
// GetConfig returns the app config
func GetConfig() *config.Config {
return config.Get()

View File

@@ -4,7 +4,9 @@ import (
"strconv"
"strings"
"git.ma-al.com/goc_daniel/b2b/app/model"
"git.ma-al.com/goc_daniel/b2b/app/service/langsService"
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
"github.com/gofiber/fiber/v3"
)
@@ -22,12 +24,8 @@ func LanguageMiddleware() fiber.Handler {
if id, err := strconv.ParseUint(langIDStr, 10, 32); err == nil {
langID = uint(id)
if langID > 0 {
lang, err := langService.GetLanguageById(langID)
if err == nil {
c.Locals("langID", langID)
c.Locals("lang", lang)
return c.Next()
}
c.Locals(constdata.USER_LOCALE, returnNewLocale(langID))
return c.Next()
}
}
}
@@ -38,12 +36,8 @@ func LanguageMiddleware() fiber.Handler {
if id, err := strconv.ParseUint(cookieLang, 10, 32); err == nil {
langID = uint(id)
if langID > 0 {
lang, err := langService.GetLanguageById(langID)
if err == nil {
c.Locals("langID", langID)
c.Locals("lang", lang)
return c.Next()
}
c.Locals(constdata.USER_LOCALE, returnNewLocale(langID))
return c.Next()
}
}
}
@@ -57,8 +51,7 @@ func LanguageMiddleware() fiber.Handler {
lang, err := langService.GetLanguageByISOCode(isoCode)
if err == nil && lang != nil {
langID = uint(lang.ID)
c.Locals("langID", langID)
c.Locals("lang", lang)
c.Locals(constdata.USER_LOCALE, returnNewLocale(langID))
return c.Next()
}
}
@@ -68,8 +61,7 @@ func LanguageMiddleware() fiber.Handler {
defaultLang, err := langService.GetDefaultLanguage()
if err == nil && defaultLang != nil {
langID = uint(defaultLang.ID)
c.Locals("langID", langID)
c.Locals("lang", defaultLang)
c.Locals(constdata.USER_LOCALE, returnNewLocale(langID))
}
return c.Next()
@@ -104,11 +96,9 @@ func parseAcceptLanguage(header string) string {
return strings.ToLower(first)
}
// GetLanguageID extracts language ID from context
func GetLanguageID(c fiber.Ctx) uint {
langID, ok := c.Locals("langID").(uint)
if !ok {
return 0
}
return langID
func returnNewLocale(lang_id uint) *model.UserLocale {
newLocale := model.UserLocale{}
newLocale.OriginalUser = &model.Customer{}
newLocale.OriginalUser.LangID = lang_id
return &newLocale
}

View File

@@ -0,0 +1,28 @@
package middleware
import (
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
func Require(p perms.Permission) fiber.Handler {
return func(c fiber.Ctx) error {
user, ok := localeExtractor.GetCustomer(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
for _, perm := range user.Role.Permissions {
if perm.Name == p {
return c.Next()
}
}
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrForbidden)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrForbidden)))
}
}

View File

@@ -0,0 +1,18 @@
package perms
type Permission string
const (
UserReadAny Permission = "user.read.any"
UserWriteAny Permission = "user.write.any"
UserDeleteAny Permission = "user.delete.any"
CurrencyWrite Permission = "currency.write"
SpecificPriceManage Permission = "specific_price.manage"
WebdavCreateToken Permission = "webdav.create_token"
ProductTranslationSave Permission = "product_translation.save"
ProductTranslationTranslate Permission = "product_translation.translate"
SearchCreateIndex Permission = "search.create_index"
OrdersViewAll Permission = "orders.view_all"
OrdersModifyAll Permission = "orders.modify_all"
Teleport Permission = "teleport"
)

View File

@@ -1,14 +1,18 @@
package public
import (
"log"
"strconv"
"time"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
"git.ma-al.com/goc_daniel/b2b/app/model"
"git.ma-al.com/goc_daniel/b2b/app/service/authService"
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
@@ -45,7 +49,7 @@ func AuthHandlerRoutes(r fiber.Router) fiber.Router {
r.Get("/google", handler.GoogleLogin)
r.Get("/google/callback", handler.GoogleCallback)
authProtected := r.Group("", middleware.AuthMiddleware())
authProtected := r.Group("", middleware.Authorize())
authProtected.Get("/me", handler.Me)
authProtected.Post("/update-choice", handler.UpdateJWTToken)
@@ -174,7 +178,13 @@ func (h *AuthHandler) ForgotPassword(c fiber.Ctx) error {
// Request password reset - always return success to prevent email enumeration
err := h.authService.RequestPasswordReset(req.Email)
if err != nil {
log.Printf("Password reset request error: %v", err)
logger.Warn("password reset request failed",
"handler", "AuthHandler.ForgotPassword",
"email", req.Email,
"error", err.Error(),
)
}
return c.JSON(fiber.Map{
@@ -264,15 +274,15 @@ func (h *AuthHandler) RefreshToken(c fiber.Ctx) error {
// Me returns the current user info
func (h *AuthHandler) Me(c fiber.Ctx) error {
user := c.Locals("user")
if user == nil {
userLocale := c.Locals(constdata.USER_LOCALE).(*model.UserLocale)
if userLocale.OriginalUser == nil {
return c.Status(fiber.StatusUnauthorized).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrNotAuthenticated),
})
}
return c.JSON(fiber.Map{
"user": user,
"user": *userLocale.OriginalUser,
})
}
@@ -303,7 +313,6 @@ func (h *AuthHandler) Register(c fiber.Ctx) error {
// Attempt registration
err := h.authService.Register(&req)
if err != nil {
log.Printf("Register error: %v", err)
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, err),
})
@@ -345,9 +354,49 @@ func (h *AuthHandler) CompleteRegistration(c fiber.Ctx) error {
return c.Status(fiber.StatusCreated).JSON(response)
}
// Updates JWT Tokens
// Updates JWT Tokens. Requires authentication and updates access token only
func (h *AuthHandler) UpdateJWTToken(c fiber.Ctx) error {
return h.authService.UpdateJWTToken(c)
userLocale, ok := c.Locals(constdata.USER_LOCALE).(*model.UserLocale)
if !ok {
return c.Status(fiber.StatusUnauthorized).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrNotAuthenticated)))
}
// Parse language and country_id from query params
langIDStr := c.Query("lang_id")
if langIDStr != "" {
parsedID, err := strconv.ParseUint(langIDStr, 10, 32)
if err != nil {
return c.Status(fiber.StatusBadRequest).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadLangID)))
}
userLocale.OriginalUser.LangID = uint(parsedID)
}
countryIDStr := c.Query("country_id")
if countryIDStr != "" {
parsedID, err := strconv.ParseUint(countryIDStr, 10, 32)
if err != nil {
return c.Status(fiber.StatusBadRequest).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadCountryID)))
}
userLocale.OriginalUser.CountryID = uint(parsedID)
}
newAccessToken, err := h.authService.UpdateJWTToken(userLocale.OriginalUser)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, err),
})
}
// does not reset refresh token
h.setAuthCookies(c, newAccessToken, "")
return c.JSON(response.Make(&fiber.Map{"token": newAccessToken}, 0, i18n.T_(c, response.Message_OK)))
}
// GoogleLogin redirects the user to Google's OAuth2 consent page
@@ -403,7 +452,6 @@ func (h *AuthHandler) GoogleCallback(c fiber.Ctx) error {
response, rawRefreshToken, err := h.authService.HandleGoogleCallback(code)
if err != nil {
log.Printf("Google OAuth callback error: %v", err)
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, err),
})
@@ -414,12 +462,12 @@ func (h *AuthHandler) GoogleCallback(c fiber.Ctx) error {
// Redirect to the locale-prefixed charts page after successful Google login.
// The user's preferred language is stored in the auth response; fall back to "en".
lang, err := h.authService.GetLangISOCode(response.User.LangID)
lang_iso_code, err := h.authService.GetLangISOCode(response.User.LangID)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadLangID)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, responseErrors.ErrBadLangID),
return c.Status(responseErrors.GetErrorStatus(err)).JSON(fiber.Map{
"error": responseErrors.GetErrorCode(c, err),
})
}
return c.Redirect().To(h.config.App.BaseURL + "/" + lang)
return c.Redirect().To(h.config.App.BaseURL + "/" + lang_iso_code)
}

View File

@@ -0,0 +1,56 @@
package public
import (
"git.ma-al.com/goc_daniel/b2b/app/service/menuService"
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type RoutingHandler struct {
menuService *menuService.MenuService
}
func NewRoutingHandler() *RoutingHandler {
menuService := menuService.New()
return &RoutingHandler{
menuService: menuService,
}
}
// AuthHandlerRoutes registers all auth routes
func RoutingHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewRoutingHandler()
r.Get("/get-routes", handler.GetRouting)
return r
}
func (h *RoutingHandler) GetRouting(c fiber.Ctx) error {
langId, ok := localeExtractor.GetLangID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
var roleId uint
customer, ok := localeExtractor.GetCustomer(c)
if !ok {
roleId = constdata.UNLOGGED_USER_ROLE_ID
} else {
roleId = customer.RoleID
}
menu, err := h.menuService.GetRoutes(langId, roleId)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&menu, 0, i18n.T_(c, response.Message_OK)))
}

View File

@@ -0,0 +1,195 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/service/addressesService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type AddressesHandler struct {
addressesService *addressesService.AddressesService
}
func NewAddressesHandler() *AddressesHandler {
addressesService := addressesService.New()
return &AddressesHandler{
addressesService: addressesService,
}
}
func AddressesHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewAddressesHandler()
r.Get("/get-template", handler.GetTemplate)
r.Post("/add-new-address", handler.AddNewAddress)
r.Post("/modify-address", handler.ModifyAddress)
r.Get("/retrieve-addresses", handler.RetrieveAddressesInfo)
r.Delete("/delete-address", handler.DeleteAddress)
return r
}
func (h *AddressesHandler) GetTemplate(c fiber.Ctx) error {
country_id_attribute := c.Query("country_id")
country_id, err := strconv.Atoi(country_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
template, err := h.addressesService.GetTemplate(uint(country_id))
if err != nil {
logger.Error("failed to get address template",
"handler", "AddressesHandler.GetTemplate",
"country_id", country_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&template, 0, i18n.T_(c, response.Message_OK)))
}
func (h *AddressesHandler) AddNewAddress(c fiber.Ctx) error {
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
address_info := string(c.Body())
if address_info == "" {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
country_id_attribute := c.Query("country_id")
country_id, err := strconv.Atoi(country_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err = h.addressesService.AddNewAddress(userID, address_info, uint(country_id))
if err != nil {
logger.Error("failed to add new address",
"handler", "AddressesHandler.AddNewAddress",
"user_id", userID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
func (h *AddressesHandler) ModifyAddress(c fiber.Ctx) error {
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
address_id_attribute := c.Query("address_id")
address_id, err := strconv.Atoi(address_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
address_info := string(c.Body())
if address_info == "" {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
country_id_attribute := c.Query("country_id")
country_id, err := strconv.Atoi(country_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err = h.addressesService.ModifyAddress(userID, uint(address_id), address_info, uint(country_id))
if err != nil {
logger.Error("failed to modify address",
"handler", "AddressesHandler.ModifyAddress",
"user_id", userID,
"address_id", address_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
func (h *AddressesHandler) RetrieveAddressesInfo(c fiber.Ctx) error {
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
addresses, err := h.addressesService.RetrieveAddresses(userID)
if err != nil {
logger.Error("failed to retrieve addresses",
"handler", "AddressesHandler.RetrieveAddressesInfo",
"user_id", userID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(addresses, 0, i18n.T_(c, response.Message_OK)))
}
func (h *AddressesHandler) DeleteAddress(c fiber.Ctx) error {
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
address_id_attribute := c.Query("address_id")
address_id, err := strconv.Atoi(address_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err = h.addressesService.DeleteAddress(userID, uint(address_id))
if err != nil {
logger.Error("failed to delete address",
"handler", "AddressesHandler.DeleteAddress",
"user_id", userID,
"address_id", address_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}

View File

@@ -5,6 +5,8 @@ import (
"git.ma-al.com/goc_daniel/b2b/app/service/cartsService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
@@ -28,23 +30,33 @@ func CartsHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewCartsHandler()
r.Get("/add-new-cart", handler.AddNewCart)
r.Delete("/remove-cart", handler.RemoveCart)
r.Get("/change-cart-name", handler.ChangeCartName)
r.Get("/retrieve-carts-info", handler.RetrieveCartsInfo)
r.Get("/retrieve-cart", handler.RetrieveCart)
r.Get("/add-product-to-cart", handler.AddProduct)
r.Delete("/remove-product-from-cart", handler.RemoveProduct)
return r
}
func (h *CartsHandler) AddNewCart(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
new_cart, err := h.cartsService.CreateNewCart(userID)
name := c.Query("name")
new_cart, err := h.cartsService.CreateNewCart(userID, name)
if err != nil {
logger.Error("failed to create cart",
"handler", "CartsHandler.AddNewCart",
"user_id", userID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
@@ -52,8 +64,39 @@ func (h *CartsHandler) AddNewCart(c fiber.Ctx) error {
return c.JSON(response.Make(&new_cart, 0, i18n.T_(c, response.Message_OK)))
}
func (h *CartsHandler) RemoveCart(c fiber.Ctx) error {
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
cart_id_attribute := c.Query("cart_id")
cart_id, err := strconv.Atoi(cart_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err = h.cartsService.RemoveCart(userID, uint(cart_id))
if err != nil {
logger.Error("failed to remove cart",
"handler", "CartsHandler.RemoveCart",
"user_id", userID,
"cart_id", cart_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
func (h *CartsHandler) ChangeCartName(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
@@ -70,6 +113,14 @@ func (h *CartsHandler) ChangeCartName(c fiber.Ctx) error {
err = h.cartsService.UpdateCartName(userID, uint(cart_id), new_name)
if err != nil {
logger.Error("failed to update cart name",
"handler", "CartsHandler.ChangeCartName",
"user_id", userID,
"cart_id", cart_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
@@ -78,7 +129,7 @@ func (h *CartsHandler) ChangeCartName(c fiber.Ctx) error {
}
func (h *CartsHandler) RetrieveCartsInfo(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
@@ -86,6 +137,13 @@ func (h *CartsHandler) RetrieveCartsInfo(c fiber.Ctx) error {
carts_info, err := h.cartsService.RetrieveCartsInfo(userID)
if err != nil {
logger.Error("failed to retrieve carts info",
"handler", "CartsHandler.RetrieveCartsInfo",
"user_id", userID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
@@ -94,7 +152,7 @@ func (h *CartsHandler) RetrieveCartsInfo(c fiber.Ctx) error {
}
func (h *CartsHandler) RetrieveCart(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
@@ -109,6 +167,14 @@ func (h *CartsHandler) RetrieveCart(c fiber.Ctx) error {
cart, err := h.cartsService.RetrieveCart(userID, uint(cart_id))
if err != nil {
logger.Error("failed to retrieve cart",
"handler", "CartsHandler.RetrieveCart",
"user_id", userID,
"cart_id", cart_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
@@ -116,8 +182,9 @@ func (h *CartsHandler) RetrieveCart(c fiber.Ctx) error {
return c.JSON(response.Make(cart, 0, i18n.T_(c, response.Message_OK)))
}
// adds or sets given amount of products to the cart
func (h *CartsHandler) AddProduct(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
@@ -158,8 +225,78 @@ func (h *CartsHandler) AddProduct(c fiber.Ctx) error {
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err = h.cartsService.AddProduct(userID, uint(cart_id), uint(product_id), product_attribute_id, uint(amount))
set_amount_attribute := c.Query("set_amount")
set_amount, err := strconv.ParseBool(set_amount_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err = h.cartsService.AddProduct(userID, uint(cart_id), uint(product_id), product_attribute_id, amount, set_amount)
if err != nil {
logger.Error("failed to add product to cart",
"handler", "CartsHandler.AddProduct",
"user_id", userID,
"cart_id", cart_id,
"product_id", product_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
// removes product from the cart.
func (h *CartsHandler) RemoveProduct(c fiber.Ctx) error {
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
cart_id_attribute := c.Query("cart_id")
cart_id, err := strconv.Atoi(cart_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
product_id_attribute := c.Query("product_id")
product_id, err := strconv.Atoi(product_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
product_attribute_id_attribute := c.Query("product_attribute_id")
var product_attribute_id *uint
if product_attribute_id_attribute == "" {
product_attribute_id = nil
} else {
val, err := strconv.Atoi(product_attribute_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
uval := uint(val)
product_attribute_id = &uval
}
err = h.cartsService.RemoveProduct(userID, uint(cart_id), uint(product_id), product_attribute_id)
if err != nil {
logger.Error("failed to remove product from cart",
"handler", "CartsHandler.RemoveProduct",
"user_id", userID,
"cart_id", cart_id,
"product_id", product_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}

View File

@@ -0,0 +1,84 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
"git.ma-al.com/goc_daniel/b2b/app/model"
"git.ma-al.com/goc_daniel/b2b/app/service/currencyService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type CurrencyHandler struct {
CurrencyService *currencyService.CurrencyService
config *config.Config
}
func NewCurrencyHandler() *CurrencyHandler {
currencyService := currencyService.New()
return &CurrencyHandler{
CurrencyService: currencyService,
config: config.Get(),
}
}
func CurrencyHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewCurrencyHandler()
r.Post("/currency-rate", middleware.Require(perms.CurrencyWrite), handler.PostCurrencyRate)
r.Get("/currency-rate/:id", handler.GetCurrencyRate)
return r
}
func (h *CurrencyHandler) PostCurrencyRate(c fiber.Ctx) error {
var currencyRate model.CurrencyRate
if err := c.Bind().Body(&currencyRate); err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrJSONBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrJSONBody)))
}
err := h.CurrencyService.CreateCurrencyRate(&currencyRate)
if err != nil {
logger.Error("failed to create currency rate",
"handler", "CurrencyHandler.PostCurrencyRate",
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 1, i18n.T_(c, response.Message_OK)))
}
func (h *CurrencyHandler) GetCurrencyRate(c fiber.Ctx) error {
idStr := c.Params("id")
id, err := strconv.Atoi(idStr)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
currency, err := h.CurrencyService.GetCurrency(uint(id))
if err != nil {
logger.Error("failed to get currency",
"handler", "CurrencyHandler.GetCurrencyRate",
"currency_id", id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(currency, 0, i18n.T_(c, response.Message_OK)))
}

View File

@@ -0,0 +1,149 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
"git.ma-al.com/goc_daniel/b2b/app/model"
"git.ma-al.com/goc_daniel/b2b/app/service/customerService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/query/query_params"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type customerHandler struct {
service *customerService.CustomerService
}
func NewCustomerHandler() *customerHandler {
customerService := customerService.New()
return &customerHandler{
service: customerService,
}
}
func CustomerHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewCustomerHandler()
r.Get("", handler.customerData)
r.Get("/list", middleware.Require(perms.UserReadAny), handler.listCustomers)
r.Patch("/no-vat", middleware.Require(perms.UserWriteAny), handler.setCustomerNoVatStatus)
return r
}
func (h *customerHandler) customerData(fc fiber.Ctx) error {
var customerId uint
user, ok := localeExtractor.GetCustomer(fc)
if !ok || user == nil {
return fc.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrBadAttribute)))
}
customerIdStr := fc.Query("id")
if customerIdStr != "" {
id, err := strconv.ParseUint(customerIdStr, 10, 64)
if err != nil {
return fiber.ErrBadRequest
}
if user.ID != uint(id) && !user.HasPermission(perms.UserReadAny) {
return fc.Status(fiber.StatusForbidden).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrForbidden)))
}
customerId = uint(id)
} else {
customerId = user.ID
}
customer, err := h.service.GetById(customerId)
if err != nil {
logger.Error("failed to get customer",
"handler", "customerHandler.customerData",
"customer_id", customerId,
"error", err.Error(),
)
return fc.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, err)))
}
return fc.JSON(response.Make(&customer, 0, i18n.T_(fc, response.Message_OK)))
}
func (h *customerHandler) listCustomers(fc fiber.Ctx) error {
user, ok := localeExtractor.GetCustomer(fc)
if !ok || user == nil {
return fc.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrBadAttribute)))
}
p, filt, err := query_params.ParseFilters[model.Customer](fc, columnMappingListUsers)
if err != nil {
return fc.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, err)))
}
search := fc.Query("search")
customer, err := h.service.Find(user.LangID, p, filt, search)
if err != nil {
logger.Error("failed to list customers",
"handler", "customerHandler.listCustomers",
"error", err.Error(),
)
return fc.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, err)))
}
return fc.JSON(response.Make(&customer, 0, i18n.T_(fc, response.Message_OK)))
}
var columnMappingListUsers map[string]string = map[string]string{
"user_id": "users.id",
"email": "users.email",
"first_name": "users.first_name",
"last_name": "users.last_name",
}
func (h *customerHandler) setCustomerNoVatStatus(fc fiber.Ctx) error {
user, ok := localeExtractor.GetCustomer(fc)
if !ok || user == nil {
return fc.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrInvalidBody)))
}
var req struct {
CustomerID uint `json:"customer_id"`
IsNoVat bool `json:"is_no_vat"`
}
if err := fc.Bind().Body(&req); err != nil {
return fc.Status(responseErrors.GetErrorStatus(responseErrors.ErrJSONBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, responseErrors.ErrJSONBody)))
}
if err := h.service.SetCustomerNoVatStatus(req.CustomerID, req.IsNoVat); err != nil {
logger.Error("failed to set customer no vat status",
"handler", "customerHandler.setCustomerNoVatStatus",
"customer_id", req.CustomerID,
"error", err.Error(),
)
return fc.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(fc, err)))
}
return fc.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(fc, response.Message_OK)))
}

View File

@@ -1,67 +0,0 @@
package restricted
import (
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/model"
"git.ma-al.com/goc_daniel/b2b/app/service/listProductsService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/query/query_params"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
// ListProductsHandler handles endpoints that receive, save and translate product descriptions.
type ListProductsHandler struct {
listProductsService *listProductsService.ListProductsService
config *config.Config
}
// NewListProductsHandler creates a new ListProductsHandler instance
func NewListProductsHandler() *ListProductsHandler {
listProductsService := listProductsService.New()
return &ListProductsHandler{
listProductsService: listProductsService,
config: config.Get(),
}
}
func ListProductsHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewListProductsHandler()
r.Get("/get-listing", handler.GetListing)
return r
}
func (h *ListProductsHandler) GetListing(c fiber.Ctx) error {
paging, filters, err := query_params.ParseFilters[model.Product](c, columnMappingGetListing)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
id_lang, ok := c.Locals("langID").(uint)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
listing, err := h.listProductsService.GetListing(id_lang, paging, filters)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&listing.Items, int(listing.Count), i18n.T_(c, response.Message_OK)))
}
var columnMappingGetListing map[string]string = map[string]string{
"product_id": "ps.id_product",
"name": "pl.name",
"reference": "ps.reference",
"category_name": "cl.name",
"id_category": "cp.id_category",
"quantity": "sa.quantity",
}

View File

@@ -3,6 +3,7 @@ package restricted
import (
"git.ma-al.com/goc_daniel/b2b/app/service/localeSelectorService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
@@ -34,6 +35,12 @@ func LocaleSelectorHandlerRoutes(r fiber.Router) fiber.Router {
func (h *LocaleSelectorHandler) GetLanguages(c fiber.Ctx) error {
languages, err := h.localeSelectorService.GetLanguages()
if err != nil {
logger.Error("failed to get languages",
"handler", "LocaleSelectorHandler.GetLanguages",
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
@@ -44,6 +51,12 @@ func (h *LocaleSelectorHandler) GetLanguages(c fiber.Ctx) error {
func (h *LocaleSelectorHandler) GetCountries(c fiber.Ctx) error {
countries, err := h.localeSelectorService.GetCountriesAndCurrencies()
if err != nil {
logger.Error("failed to get countries",
"handler", "LocaleSelectorHandler.GetCountries",
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}

View File

@@ -1,115 +0,0 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/service/meiliService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type MeiliSearchHandler struct {
meiliService *meiliService.MeiliService
}
func NewMeiliSearchHandler() *MeiliSearchHandler {
meiliService := meiliService.New()
return &MeiliSearchHandler{
meiliService: meiliService,
}
}
func MeiliSearchHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewMeiliSearchHandler()
// for testing purposes only. Must be removed before proper release.
r.Get("/create-index", handler.CreateIndex)
r.Get("/test", handler.Test)
// for all users
r.Get("/search", handler.Search)
return r
}
func (h *MeiliSearchHandler) CreateIndex(c fiber.Ctx) error {
id_lang, ok := c.Locals("langID").(uint)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err := h.meiliService.CreateIndex(id_lang)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
nothing := ""
return c.JSON(response.Make(&nothing, 0, i18n.T_(c, response.Message_OK)))
}
func (h *MeiliSearchHandler) Test(c fiber.Ctx) error {
id_lang, ok := c.Locals("langID").(uint)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
test, err := h.meiliService.Test(id_lang)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&test, 0, i18n.T_(c, response.Message_OK)))
}
func (h *MeiliSearchHandler) Search(c fiber.Ctx) error {
id_lang, ok := c.Locals("langID").(uint)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
query := c.Query("query")
limit_attribute := c.Query("limit")
limit, err := strconv.Atoi(limit_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
id_category_attribute := c.Query("id_category", "0")
id_category, err := strconv.Atoi(id_category_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
price_lower_bound_attribute := c.Query("price_lower_bound", "-1.0")
price_lower_bound, err := strconv.ParseFloat(price_lower_bound_attribute, 64)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
price_upper_bound_attribute := c.Query("price_upper_bound", "-1.0")
price_upper_bound, err := strconv.ParseFloat(price_upper_bound_attribute, 64)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
meili_response, err := h.meiliService.Search(id_lang, query, uint(limit), uint(id_category), price_lower_bound, price_upper_bound)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&meili_response, 0, i18n.T_(c, response.Message_OK)))
}

View File

@@ -1,8 +1,12 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/service/menuService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
@@ -23,51 +27,92 @@ func NewMenuHandler() *MenuHandler {
func MenuHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewMenuHandler()
r.Get("/get-menu", handler.GetMenu)
r.Get("/get-routes", handler.GetRouting)
r.Get("/get-category-tree", handler.GetCategoryTree)
r.Get("/get-breadcrumb", handler.GetBreadcrumb)
r.Get("/get-top-menu", handler.GetTopMenu)
return r
}
func (h *MenuHandler) GetMenu(c fiber.Ctx) error {
lang_id, ok := c.Locals("langID").(uint)
func (h *MenuHandler) GetCategoryTree(c fiber.Ctx) error {
lang_id, ok := localeExtractor.GetLangID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
menu, err := h.menuService.GetMenu(lang_id)
root_category_id_attribute := c.Query("root_category_id")
root_category_id, err := strconv.Atoi(root_category_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
category_tree, err := h.menuService.GetCategoryTree(uint(root_category_id), lang_id)
if err != nil {
logger.Error("failed to get category tree",
"handler", "MenuHandler.GetCategoryTree",
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&menu, 0, i18n.T_(c, response.Message_OK)))
return c.JSON(response.Make(&category_tree, 0, i18n.T_(c, response.Message_OK)))
}
func (h *MenuHandler) GetRouting(c fiber.Ctx) error {
lang_id, ok := c.Locals("langID").(uint)
func (h *MenuHandler) GetBreadcrumb(c fiber.Ctx) error {
lang_id, ok := localeExtractor.GetLangID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
menu, err := h.menuService.GetRoutes(lang_id)
root_category_id_attribute := c.Query("root_category_id")
root_category_id, err := strconv.Atoi(root_category_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
category_id_attribute := c.Query("category_id")
category_id, err := strconv.Atoi(category_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
breadcrumb, err := h.menuService.GetBreadcrumb(uint(root_category_id), uint(category_id), lang_id)
if err != nil {
logger.Error("failed to get breadcrumb",
"handler", "MenuHandler.GetBreadcrumb",
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&menu, 0, i18n.T_(c, response.Message_OK)))
return c.JSON(response.Make(&breadcrumb, 0, i18n.T_(c, response.Message_OK)))
}
func (h *MenuHandler) GetTopMenu(c fiber.Ctx) error {
lang_id, ok := c.Locals("langID").(uint)
if !ok {
customer, ok := localeExtractor.GetCustomer(c)
if !ok || customer == nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
menu, err := h.menuService.GetTopMenu(lang_id)
menu, err := h.menuService.GetTopMenu(customer.LangID, customer.RoleID)
if err != nil {
logger.Error("failed to get top menu",
"handler", "MenuHandler.GetTopMenu",
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}

View File

@@ -0,0 +1,204 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/model"
"git.ma-al.com/goc_daniel/b2b/app/service/orderService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/query/query_params"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type OrdersHandler struct {
ordersService *orderService.OrderService
}
func NewOrdersHandler() *OrdersHandler {
ordersService := orderService.New()
return &OrdersHandler{
ordersService: ordersService,
}
}
func OrdersHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewOrdersHandler()
r.Get("/list", handler.ListOrders)
r.Post("/place-new-order", handler.PlaceNewOrder)
r.Post("/change-order-address", handler.ChangeOrderAddress)
r.Get("/change-order-status", handler.ChangeOrderStatus)
return r
}
// when a user (not admin) wants to list orders, we automatically append filter to only view his orders.
// we base permissions and user based on target user only.
func (h *OrdersHandler) ListOrders(c fiber.Ctx) error {
user, ok := localeExtractor.GetCustomer(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
paging, filters, err := query_params.ParseFilters[model.CustomerOrder](c, columnMappingListOrders)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
list, err := h.ordersService.Find(user, paging, filters)
if err != nil {
logger.Error("failed to list orders",
"handler", "OrdersHandler.ListOrders",
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&list.Items, int(list.Count), i18n.T_(c, response.Message_OK)))
}
var columnMappingListOrders map[string]string = map[string]string{
"order_id": "b2b_customer_orders.order_id",
"user_id": "b2b_customer_orders.user_id",
"name": "b2b_customer_orders.name",
"country_id": "b2b_customer_orders.country_id",
"status": "b2b_customer_orders.status",
"base_price": "b2b_customer_orders.base_price",
"tax_incl": "b2b_customer_orders.tax_incl",
"tax_excl": "b2b_customer_orders.tax_excl",
"created_at": "b2b_customer_orders.created_at",
"updated_at": "b2b_customer_orders.updated_at",
}
func (h *OrdersHandler) PlaceNewOrder(c fiber.Ctx) error {
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
cart_id_attribute := c.Query("cart_id")
cart_id, err := strconv.Atoi(cart_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
country_id_attribute := c.Query("country_id")
country_id, err := strconv.Atoi(country_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
address_info := string(c.Body())
if address_info == "" {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
name := c.Query("name")
err = h.ordersService.PlaceNewOrder(userID, uint(cart_id), name, uint(country_id), address_info)
if err != nil {
logger.Error("failed to place order",
"handler", "OrdersHandler.PlaceNewOrder",
"user_id", userID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
// we base permissions and user based on target user only.
func (h *OrdersHandler) ChangeOrderAddress(c fiber.Ctx) error {
user, ok := localeExtractor.GetCustomer(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
order_id_attribute := c.Query("order_id")
order_id, err := strconv.Atoi(order_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
country_id_attribute := c.Query("country_id")
country_id, err := strconv.Atoi(country_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
address_info := string(c.Body())
if address_info == "" {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
err = h.ordersService.ChangeOrderAddress(user, uint(order_id), uint(country_id), address_info)
if err != nil {
logger.Error("failed to change order address",
"handler", "OrdersHandler.ChangeOrderAddress",
"order_id", order_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
// we base permissions and user based on target user only.
// TODO: well, permissions and all that.
func (h *OrdersHandler) ChangeOrderStatus(c fiber.Ctx) error {
user, ok := localeExtractor.GetCustomer(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
order_id_attribute := c.Query("order_id")
order_id, err := strconv.Atoi(order_id_attribute)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
status := c.Query("status")
err = h.ordersService.ChangeOrderStatus(user, uint(order_id), status)
if err != nil {
logger.Error("failed to change order status",
"handler", "OrdersHandler.ChangeOrderStatus",
"order_id", order_id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}

View File

@@ -0,0 +1,227 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/model/dbmodel"
"git.ma-al.com/goc_daniel/b2b/app/service/productService"
constdata "git.ma-al.com/goc_daniel/b2b/app/utils/const_data"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/query/query_params"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type ProductsHandler struct {
productService *productService.ProductService
config *config.Config
}
// NewListProductsHandler creates a new ListProductsHandler instance
func NewProductsHandler() *ProductsHandler {
productService := productService.New()
return &ProductsHandler{
productService: productService,
config: config.Get(),
}
}
func ProductsHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewProductsHandler()
r.Get("/:id/:country_id/:quantity", handler.GetProductJson)
r.Get("/list", handler.ListProducts)
r.Get("/list-variants/:product_id", handler.ListProductVariants)
r.Post("/favorite/:product_id", handler.AddToFavorites)
r.Delete("/favorite/:product_id", handler.RemoveFromFavorites)
return r
}
func (h *ProductsHandler) GetProductJson(c fiber.Ctx) error {
idStr := c.Params("id")
p_id_product, err := strconv.Atoi(idStr)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
country_idStr := c.Params("country_id")
b2b_id_country, err := strconv.Atoi(country_idStr)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
quantityStr := c.Params("quantity")
p_quantity, err := strconv.Atoi(quantityStr)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
customer, ok := localeExtractor.GetCustomer(c)
if !ok || customer == nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
productJson, err := h.productService.Get(uint(p_id_product), customer.LangID, customer.ID, uint(b2b_id_country), uint(p_quantity))
if err != nil {
logger.Error("failed to get product",
"handler", "ProductsHandler.GetProductJson",
"product_id", p_id_product,
"lang_id", customer.LangID,
"customer_id", customer.ID,
"b2b_id_country", b2b_id_country,
"quantity", p_quantity,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&productJson, 1, i18n.T_(c, response.Message_OK)))
}
func (h *ProductsHandler) ListProducts(c fiber.Ctx) error {
paging, filters, err := query_params.ParseFilters[dbmodel.PsProduct](c, columnMappingListProducts)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
customer, ok := localeExtractor.GetCustomer(c)
if !ok || customer == nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
list, err := h.productService.Find(customer.LangID, customer.ID, paging, filters, customer, constdata.DEFAULT_PRODUCT_QUANTITY, constdata.SHOP_ID)
if err != nil {
logger.Error("failed to list products",
"handler", "ProductsHandler.ListProducts",
"lang_id", customer.LangID,
"customer_id", customer.ID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&list.Items, int(list.Count), i18n.T_(c, response.Message_OK)))
}
// These are all the filterable fields
var columnMappingListProducts map[string]string = map[string]string{
"product_id": "bp.product_id",
"name": "bp.name",
"reference": "bp.reference",
"category_id": "bp.category_id",
"quantity": "bp.quantity",
"is_favorite": "bp.is_favorite",
"is_new": "bp.is_new",
"is_oem": "bp.is_oem",
}
func (h *ProductsHandler) AddToFavorites(c fiber.Ctx) error {
productIDStr := c.Params("product_id")
productID, err := strconv.Atoi(productIDStr)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
err = h.productService.AddToFavorites(userID, uint(productID))
if err != nil {
logger.Error("failed to add to favorites",
"handler", "ProductsHandler.AddToFavorites",
"user_id", userID,
"product_id", productID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
func (h *ProductsHandler) RemoveFromFavorites(c fiber.Ctx) error {
productIDStr := c.Params("product_id")
productID, err := strconv.Atoi(productIDStr)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
err = h.productService.RemoveFromFavorites(userID, uint(productID))
if err != nil {
logger.Error("failed to remove from favorites",
"handler", "ProductsHandler.RemoveFromFavorites",
"user_id", userID,
"product_id", productID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
func (h *ProductsHandler) ListProductVariants(c fiber.Ctx) error {
productIDStr := c.Params("product_id")
productID, err := strconv.Atoi(productIDStr)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
customer, ok := localeExtractor.GetCustomer(c)
if !ok || customer == nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
list, err := h.productService.GetProductAttributes(customer.LangID, uint(productID), constdata.SHOP_ID, customer.ID, customer.CountryID, constdata.DEFAULT_PRODUCT_QUANTITY)
if err != nil {
logger.Error("failed to list product variants",
"handler", "ProductsHandler.ListProductVariants",
"product_id", productID,
"customer_id", customer.ID,
"lang_id", customer.LangID,
"country_id", customer.CountryID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&list, len(list), i18n.T_(c, response.Message_OK)))
}

View File

@@ -4,8 +4,12 @@ import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
"git.ma-al.com/goc_daniel/b2b/app/service/productTranslationService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
@@ -33,15 +37,15 @@ func ProductTranslationHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewProductTranslationHandler()
r.Get("/get-product-description", handler.GetProductDescription)
r.Post("/save-product-description", handler.SaveProductDescription)
r.Get("/translate-product-description", handler.TranslateProductDescription)
r.Post("/save-product-description", middleware.Require(perms.ProductTranslationSave), handler.SaveProductDescription)
r.Get("/translate-product-description", middleware.Require(perms.ProductTranslationTranslate), handler.TranslateProductDescription)
return r
}
// GetProductDescription returns the product description for a given product ID
func (h *ProductTranslationHandler) GetProductDescription(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
@@ -63,6 +67,13 @@ func (h *ProductTranslationHandler) GetProductDescription(c fiber.Ctx) error {
description, err := h.productTranslationService.GetProductDescription(userID, uint(productID), uint(productLangID))
if err != nil {
logger.Error("failed to get product description",
"handler", "ProductTranslationHandler.GetProductDescription",
"product_id", productID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
@@ -72,7 +83,7 @@ func (h *ProductTranslationHandler) GetProductDescription(c fiber.Ctx) error {
// SaveProductDescription saves the description for a given product ID, in given language
func (h *ProductTranslationHandler) SaveProductDescription(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
@@ -100,6 +111,13 @@ func (h *ProductTranslationHandler) SaveProductDescription(c fiber.Ctx) error {
err = h.productTranslationService.SaveProductDescription(userID, uint(productID), uint(productLangID), updates)
if err != nil {
logger.Error("failed to save product description",
"handler", "ProductTranslationHandler.SaveProductDescription",
"product_id", productID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
@@ -109,7 +127,7 @@ func (h *ProductTranslationHandler) SaveProductDescription(c fiber.Ctx) error {
// TranslateProductDescription returns translated product description
func (h *ProductTranslationHandler) TranslateProductDescription(c fiber.Ctx) error {
userID, ok := c.Locals("userID").(uint)
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
@@ -144,6 +162,13 @@ func (h *ProductTranslationHandler) TranslateProductDescription(c fiber.Ctx) err
description, err := h.productTranslationService.TranslateProductDescription(userID, uint(productID), uint(productFromLangID), uint(productToLangID), aiModel)
if err != nil {
logger.Error("failed to translate product description",
"handler", "ProductTranslationHandler.TranslateProductDescription",
"product_id", productID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}

View File

@@ -0,0 +1,135 @@
package restricted
import (
"encoding/json"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
"git.ma-al.com/goc_daniel/b2b/app/service/meiliService"
searchservice "git.ma-al.com/goc_daniel/b2b/app/service/searchService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type MeiliSearchHandler struct {
meiliService *meiliService.MeiliService
searchService *searchservice.SearchService
}
func NewMeiliSearchHandler() *MeiliSearchHandler {
return &MeiliSearchHandler{
meiliService: meiliService.New(),
searchService: searchservice.New(),
}
}
func MeiliSearchHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewMeiliSearchHandler()
r.Get("/create-index", middleware.Require(perms.SearchCreateIndex), handler.CreateIndex)
r.Post("/search", handler.Search)
r.Post("/settings", handler.GetSettings)
return r
}
func (h *MeiliSearchHandler) CreateIndex(c fiber.Ctx) error {
id_lang, ok := localeExtractor.GetLangID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err := h.meiliService.CreateIndex(id_lang)
if err != nil {
logger.Error("failed to create search index",
"handler", "MeiliSearchHandler.CreateIndex",
"lang_id", id_lang,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
func (h *MeiliSearchHandler) Search(c fiber.Ctx) error {
id_lang, ok := localeExtractor.GetLangID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
index := meiliService.GetIndexName(id_lang)
var body map[string]interface{}
if err := json.Unmarshal(c.Body(), &body); err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
result, err := h.searchService.Search(index, c.Body(), id_lang)
if err != nil {
logger.Error("failed to search",
"handler", "MeiliSearchHandler.Search",
"index", index,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
if h.searchService.IsIndexNotFound(result.Body) {
if createErr := h.meiliService.CreateIndex(id_lang); createErr == nil {
result, err = h.searchService.Search(index, c.Body(), id_lang)
if err != nil {
logger.Error("failed to search after index creation",
"handler", "MeiliSearchHandler.Search",
"index", index,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
}
}
return c.Status(result.StatusCode).Send(result.Body)
}
func (h *MeiliSearchHandler) GetSettings(c fiber.Ctx) error {
id_lang, ok := localeExtractor.GetLangID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
index := meiliService.GetIndexName(id_lang)
result, err := h.searchService.GetIndexSettings(index)
if err != nil {
logger.Error("failed to get index settings",
"handler", "MeiliSearchHandler.GetSettings",
"index", index,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.Status(result.StatusCode).Send(result.Body)
}

View File

@@ -0,0 +1,208 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
"git.ma-al.com/goc_daniel/b2b/app/model"
"git.ma-al.com/goc_daniel/b2b/app/service/specificPriceService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type SpecificPriceHandler struct {
SpecificPriceService *specificPriceService.SpecificPriceService
config *config.Config
}
func NewSpecificPriceHandler() *SpecificPriceHandler {
SpecificPriceService := specificPriceService.New()
return &SpecificPriceHandler{
SpecificPriceService: SpecificPriceService,
config: config.Get(),
}
}
func SpecificPriceHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewSpecificPriceHandler()
r.Post("/", middleware.Require(perms.SpecificPriceManage), handler.Create)
r.Put("/:id", middleware.Require(perms.SpecificPriceManage), handler.Update)
r.Delete("/:id", middleware.Require(perms.SpecificPriceManage), handler.Delete)
r.Get("/", middleware.Require(perms.SpecificPriceManage), handler.List)
r.Get("/:id", middleware.Require(perms.SpecificPriceManage), handler.GetByID)
r.Patch("/:id/activate", middleware.Require(perms.SpecificPriceManage), handler.Activate)
r.Patch("/:id/deactivate", middleware.Require(perms.SpecificPriceManage), handler.Deactivate)
return r
}
func (h *SpecificPriceHandler) Create(c fiber.Ctx) error {
var pr model.SpecificPrice
if err := c.Bind().Body(&pr); err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
result, err := h.SpecificPriceService.Create(c.Context(), &pr)
if err != nil {
logger.Error("failed to create specific price",
"handler", "SpecificPriceHandler.Create",
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&result, 1, i18n.T_(c, response.Message_OK)))
}
func (h *SpecificPriceHandler) Update(c fiber.Ctx) error {
idStr := c.Params("id")
id, err := strconv.ParseUint(idStr, 10, 64)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
var pr model.SpecificPrice
if err := c.Bind().Body(&pr); err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
result, err := h.SpecificPriceService.Update(c.Context(), id, &pr)
if err != nil {
logger.Error("failed to update specific price",
"handler", "SpecificPriceHandler.Update",
"specific_price_id", id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&result, 1, i18n.T_(c, response.Message_OK)))
}
func (h *SpecificPriceHandler) List(c fiber.Ctx) error {
result, err := h.SpecificPriceService.List(c.Context())
if err != nil {
logger.Error("failed to list specific prices",
"handler", "SpecificPriceHandler.List",
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&result, 1, i18n.T_(c, response.Message_OK)))
}
func (h *SpecificPriceHandler) GetByID(c fiber.Ctx) error {
idStr := c.Params("id")
id, err := strconv.ParseUint(idStr, 10, 64)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
result, err := h.SpecificPriceService.GetByID(c.Context(), id)
if err != nil {
logger.Error("failed to get specific price",
"handler", "SpecificPriceHandler.GetByID",
"specific_price_id", id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&result, 1, i18n.T_(c, response.Message_OK)))
}
func (h *SpecificPriceHandler) Activate(c fiber.Ctx) error {
idStr := c.Params("id")
id, err := strconv.ParseUint(idStr, 10, 64)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err = h.SpecificPriceService.SetActive(c.Context(), id, true)
if err != nil {
logger.Error("failed to activate specific price",
"handler", "SpecificPriceHandler.Activate",
"specific_price_id", id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
func (h *SpecificPriceHandler) Deactivate(c fiber.Ctx) error {
idStr := c.Params("id")
id, err := strconv.ParseUint(idStr, 10, 64)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err = h.SpecificPriceService.SetActive(c.Context(), id, false)
if err != nil {
logger.Error("failed to deactivate specific price",
"handler", "SpecificPriceHandler.Deactivate",
"specific_price_id", id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}
func (h *SpecificPriceHandler) Delete(c fiber.Ctx) error {
idStr := c.Params("id")
id, err := strconv.ParseUint(idStr, 10, 64)
if err != nil {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrBadAttribute)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrBadAttribute)))
}
err = h.SpecificPriceService.Delete(c.Context(), id)
if err != nil {
logger.Error("failed to delete specific price",
"handler", "SpecificPriceHandler.Delete",
"specific_price_id", id,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(nullable.GetNil(""), 0, i18n.T_(c, response.Message_OK)))
}

View File

@@ -0,0 +1,114 @@
package restricted
import (
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
"git.ma-al.com/goc_daniel/b2b/app/service/storageService"
"git.ma-al.com/goc_daniel/b2b/app/utils/i18n"
"git.ma-al.com/goc_daniel/b2b/app/utils/localeExtractor"
"git.ma-al.com/goc_daniel/b2b/app/utils/logger"
"git.ma-al.com/goc_daniel/b2b/app/utils/nullable"
"git.ma-al.com/goc_daniel/b2b/app/utils/response"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type StorageHandler struct {
storageService *storageService.StorageService
config *config.Config
}
func NewStorageHandler() *StorageHandler {
return &StorageHandler{
storageService: storageService.New(),
config: config.Get(),
}
}
func StorageHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewStorageHandler()
// for all users
r.Get("/list-content/*", handler.ListContent)
r.Get("/download-file/*", handler.DownloadFile)
// for admins only
r.Get("/create-new-webdav-token", middleware.Require(perms.WebdavCreateToken), handler.CreateNewWebdavToken)
return r
}
// accepted path looks like e.g. "/folder1/" or "folder1"
func (h *StorageHandler) ListContent(c fiber.Ctx) error {
// relative path defaults to root directory
abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
entries_in_list, err := h.storageService.ListContent(abs_path)
if err != nil {
logger.Error("failed to list storage content",
"handler", "StorageHandler.ListContent",
"path", abs_path,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(entries_in_list, 0, i18n.T_(c, response.Message_OK)))
}
func (h *StorageHandler) DownloadFile(c fiber.Ctx) error {
abs_path, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
if err != nil {
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
f, filename, filesize, err := h.storageService.DownloadFilePrep(abs_path)
if err != nil {
logger.Error("failed to prepare file download",
"handler", "StorageHandler.DownloadFile",
"path", abs_path,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
c.Attachment(filename)
c.Set("Content-Length", strconv.FormatInt(filesize, 10))
c.Set("Content-Type", "application/octet-stream")
return c.SendStream(f, int(filesize))
}
func (h *StorageHandler) CreateNewWebdavToken(c fiber.Ctx) error {
userID, ok := localeExtractor.GetUserID(c)
if !ok {
return c.Status(responseErrors.GetErrorStatus(responseErrors.ErrInvalidBody)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, responseErrors.ErrInvalidBody)))
}
new_token, err := h.storageService.NewWebdavToken(userID)
if err != nil {
logger.Error("failed to create webdav token",
"handler", "StorageHandler.CreateNewWebdavToken",
"user_id", userID,
"error", err.Error(),
)
return c.Status(responseErrors.GetErrorStatus(err)).
JSON(response.Make(nullable.GetNil(""), 0, responseErrors.GetErrorCode(c, err)))
}
return c.JSON(response.Make(&new_token, 0, i18n.T_(c, response.Message_OK)))
}

View File

@@ -21,10 +21,12 @@ type SettingsResponse struct {
// AppSettings represents app configuration
type AppSettings struct {
Name string `json:"name"`
Environment string `json:"environment"`
BaseURL string `json:"base_url"`
PasswordRegex string `json:"password_regex"`
Name string `json:"name"`
Environment string `json:"environment"`
BaseURL string `json:"base_url"`
PasswordRegex string `json:"password_regex"`
CategoryTreeRootID uint `json:"category_tree_root_id"`
ShopDefaultLanguage uint `json:"shop_default_language"`
// Config config.Config `json:"config"`
}
@@ -65,10 +67,12 @@ func (h *SettingsHandler) GetSettings(cfg *config.Config) fiber.Handler {
return func(c fiber.Ctx) error {
settings := SettingsResponse{
App: AppSettings{
Name: cfg.App.Name,
Environment: cfg.App.Environment,
BaseURL: cfg.App.BaseURL,
PasswordRegex: constdata.PASSWORD_VALIDATION_REGEX,
Name: cfg.App.Name,
Environment: cfg.App.Environment,
BaseURL: cfg.App.BaseURL,
PasswordRegex: constdata.PASSWORD_VALIDATION_REGEX,
CategoryTreeRootID: constdata.CATEGORY_TREE_ROOT_ID,
ShopDefaultLanguage: constdata.SHOP_DEFAULT_LANGUAGE,
// Config: *config.Get(),
},
Server: ServerSettings{

View File

@@ -0,0 +1,198 @@
package webdav
import (
"bytes"
"io"
"net/http"
"strconv"
"git.ma-al.com/goc_daniel/b2b/app/config"
"git.ma-al.com/goc_daniel/b2b/app/service/storageService"
"git.ma-al.com/goc_daniel/b2b/app/utils/responseErrors"
"github.com/gofiber/fiber/v3"
)
type StorageHandler struct {
storageService *storageService.StorageService
config *config.Config
}
func NewStorageHandler() *StorageHandler {
return &StorageHandler{
storageService: storageService.New(),
config: config.Get(),
}
}
func StorageHandlerRoutes(r fiber.Router) fiber.Router {
handler := NewStorageHandler()
// for webdav use only
r.Get("/*", handler.Get)
r.Head("/*", handler.Get)
r.Put("/*", handler.Put)
r.Delete("/*", handler.Delete)
r.Add([]string{"MKCOL"}, "/*", handler.Mkcol)
r.Add([]string{"PROPFIND"}, "/*", handler.Propfind)
r.Add([]string{"PROPPATCH"}, "/*", handler.Proppatch)
r.Add([]string{"MOVE"}, "/*", handler.Move)
r.Add([]string{"COPY"}, "/*", handler.Copy)
return r
}
func (h *StorageHandler) Get(c fiber.Ctx) error {
// fmt.Println("GET")
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
info, err := h.storageService.EntryInfo(absPath)
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
if info.IsDir() {
xml, err := h.storageService.Propfind(h.config.Storage.RootFolder, absPath, "1")
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
c.Set("Content-Type", `application/xml; charset="utf-8"`)
return c.Status(http.StatusMultiStatus).SendString(xml)
} else {
f, filename, filesize, err := h.storageService.DownloadFilePrep(absPath)
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
c.Attachment(filename)
c.Set("Content-Length", strconv.FormatInt(filesize, 10))
c.Set("Content-Type", "application/octet-stream")
return c.SendStream(f, int(filesize))
}
}
func (h *StorageHandler) Put(c fiber.Ctx) error {
// fmt.Println("PUT")
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
var src io.Reader
if bodyStream := c.Request().BodyStream(); bodyStream != nil {
defer c.Request().CloseBodyStream()
src = bodyStream
} else {
src = bytes.NewReader(c.Body())
}
err = h.storageService.Put(absPath, src)
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
return c.SendStatus(http.StatusCreated)
}
func (h *StorageHandler) Delete(c fiber.Ctx) error {
// fmt.Println("DELETE")
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
if absPath == h.config.Storage.RootFolder {
return c.SendStatus(responseErrors.GetErrorStatus(responseErrors.ErrAccessDenied))
}
err = h.storageService.Delete(absPath)
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
return c.SendStatus(http.StatusNoContent)
}
func (h *StorageHandler) Mkcol(c fiber.Ctx) error {
// fmt.Println("Mkcol")
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
err = h.storageService.Mkcol(absPath)
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
return c.SendStatus(http.StatusCreated)
}
func (h *StorageHandler) Propfind(c fiber.Ctx) error {
// fmt.Println("PROPFIND")
absPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
xml, err := h.storageService.Propfind(h.config.Storage.RootFolder, absPath, "1")
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
c.Set("Content-Type", `application/xml; charset="utf-8"`)
return c.Status(http.StatusMultiStatus).SendString(xml)
}
func (h *StorageHandler) Proppatch(c fiber.Ctx) error {
return c.SendStatus(http.StatusNotImplemented) // 501
}
func (h *StorageHandler) Move(c fiber.Ctx) error {
// fmt.Println("MOVE")
srcAbsPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
dest := c.Get("Destination")
if dest == "" {
return c.SendStatus(http.StatusBadRequest)
}
destAbsPath, err := h.storageService.ObtainDestPath(h.config.Storage.RootFolder, dest)
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
err = h.storageService.Move(srcAbsPath, destAbsPath)
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
return c.SendStatus(http.StatusCreated)
}
func (h *StorageHandler) Copy(c fiber.Ctx) error {
// fmt.Println("COPY")
srcAbsPath, err := h.storageService.AbsPath(h.config.Storage.RootFolder, c.Params("*"))
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
dest := c.Get("Destination")
if dest == "" {
return c.SendStatus(http.StatusBadRequest)
}
destAbsPath, err := h.storageService.ObtainDestPath(h.config.Storage.RootFolder, dest)
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
err = h.storageService.Copy(srcAbsPath, destAbsPath)
if err != nil {
return c.SendStatus(responseErrors.GetErrorStatus(err))
}
return c.SendStatus(http.StatusCreated)
}

View File

@@ -14,11 +14,10 @@ import (
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/api"
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/api/public"
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/api/restricted"
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/api/webdav"
"git.ma-al.com/goc_daniel/b2b/app/delivery/web/general"
// "github.com/gofiber/fiber/v2/middleware/filesystem"
"github.com/gofiber/fiber/v3"
// "github.com/gofiber/fiber/v3/middleware/filesystem"
"github.com/gofiber/fiber/v3/middleware/logger"
"github.com/gofiber/fiber/v3/middleware/recover"
)
@@ -27,6 +26,7 @@ import (
type Server struct {
app *fiber.App
cfg *config.Config
webdav fiber.Router
api fiber.Router
public fiber.Router
restricted fiber.Router
@@ -44,12 +44,23 @@ func (s *Server) Cfg() *config.Config {
// New creates a new server instance
func New() *Server {
return &Server{
app: fiber.New(fiber.Config{
ErrorHandler: customErrorHandler,
}),
cfg: config.Get(),
}
var s Server
app :=
fiber.New(fiber.Config{
ErrorHandler: customErrorHandler,
BodyLimit: 50 * 1024 * 1024, // 50 MB
StreamRequestBody: true,
RequestMethods: []string{
fiber.MethodGet, fiber.MethodHead, fiber.MethodPost, fiber.MethodPut,
fiber.MethodDelete, fiber.MethodConnect, fiber.MethodOptions,
fiber.MethodTrace, fiber.MethodPatch, "MKCOL", "PROPFIND", "PROPPATCH", "MOVE", "COPY",
},
})
s.app = app
s.cfg = config.Get()
return &s
}
// Setup configures the server with routes and middleware
@@ -75,9 +86,12 @@ func (s *Server) Setup() error {
// API routes
s.api = s.app.Group("/api/v1")
s.api.Use(middleware.Authenticate())
s.public = s.api.Group("/public")
s.restricted = s.api.Group("/restricted")
s.restricted.Use(middleware.AuthMiddleware())
s.restricted.Use(middleware.Authorize())
s.webdav = s.api.Group("/webdav")
s.webdav.Use(middleware.Webdav())
// initialize language endpoints (general)
api.NewLangHandler().InitLanguage(s.api, s.cfg)
@@ -89,13 +103,18 @@ func (s *Server) Setup() error {
auth := s.public.Group("/auth")
public.AuthHandlerRoutes(auth)
menuRouting := s.public.Group("/menu")
public.RoutingHandlerRoutes(menuRouting)
pCustomer := s.restricted.Group("/customer")
restricted.CustomerHandlerRoutes(pCustomer)
// product translation routes (restricted)
productTranslation := s.restricted.Group("/product-translation")
restricted.ProductTranslationHandlerRoutes(productTranslation)
// listing products routes (restricted)
listProducts := s.restricted.Group("/list-products")
restricted.ListProductsHandlerRoutes(listProducts)
product := s.restricted.Group("/product")
restricted.ProductsHandlerRoutes(product)
// locale selector (restricted)
// this is basically for changing user's selected language and country
@@ -107,13 +126,32 @@ func (s *Server) Setup() error {
restricted.MenuHandlerRoutes(menu)
// meili search (restricted)
meiliSearch := s.restricted.Group("/meili-search")
meiliSearch := s.restricted.Group("/search")
restricted.MeiliSearchHandlerRoutes(meiliSearch)
// carts (restricted)
carts := s.restricted.Group("/carts")
restricted.CartsHandlerRoutes(carts)
// orders (restricted)
orders := s.restricted.Group("/orders")
restricted.OrdersHandlerRoutes(orders)
specificPrice := s.restricted.Group("/specific-price")
restricted.SpecificPriceHandlerRoutes(specificPrice)
// addresses (restricted)
addresses := s.restricted.Group("/addresses")
restricted.AddressesHandlerRoutes(addresses)
// storage (uses various authorization means)
restrictedStorage := s.restricted.Group("/storage")
webdavStorage := s.webdav.Group("/storage")
restricted.StorageHandlerRoutes(restrictedStorage)
webdav.StorageHandlerRoutes(webdavStorage)
restricted.CurrencyHandlerRoutes(s.restricted)
s.api.All("*", func(c fiber.Ctx) error {
return c.SendStatus(fiber.StatusNotFound)
})
@@ -129,16 +167,6 @@ func (s *Server) Setup() error {
// })
// })
// // Admin routes example
// admin := s.api.Group("/admin")
// admin.Use(middleware.AuthMiddleware())
// admin.Use(middleware.RequireAdmin())
// admin.Get("/users", func(c fiber.Ctx) error {
// return c.JSON(fiber.Map{
// "message": "Admin area - user management",
// })
// })
// keep this at the end because its wilderange
general.InitBo(s.App())

72
app/model/address.go Normal file
View File

@@ -0,0 +1,72 @@
package model
type Address struct {
ID uint `gorm:"column:id;primaryKey;autoIncrement" json:"id"`
CustomerID uint `gorm:"column:b2b_customer_id;not null;index" json:"customer_id"`
AddressString string `gorm:"column:address_string;not null" json:"address_string"`
AddressUnparsed *AddressUnparsed `gorm:"-" json:"address_unparsed"`
CountryID uint `gorm:"column:b2b_country_id;not null" json:"country_id"`
}
func (Address) TableName() string {
return "b2b_addresses"
}
type AddressUnparsed interface{}
// Address template in Poland
type AddressPL struct {
PostalCode string `json:"postal_code"` // format: 00-000
City string `json:"city"` // e.g. Kraków
Voivodeship string `json:"voivodeship"` // e.g. małopolskie (optional but useful)
Street string `json:"street"` // e.g. Marszałkowska
BuildingNo string `json:"building_no"` // e.g. 10, 221B, 12A
ApartmentNo string `json:"apartment_no"` // e.g. 5, 12B
AddressLine2 string `json:"address_line2"` // optional extra info
Recipient string `json:"recipient"` // name/company
}
// Address template in Great Britain
type AddressGB struct {
PostalCode string `json:"postal_code"` // e.g. SW1A 1AA
PostTown string `json:"post_town"` // e.g. London
County string `json:"county"` // optional
Thoroughfare string `json:"thoroughfare"` // street name, e.g. Baker Street
BuildingNo string `json:"building_no"` // e.g. 221B
BuildingName string `json:"building_name"` // e.g. Flatiron House
SubBuilding string `json:"sub_building"` // e.g. Flat 5, Apt 2
AddressLine2 string `json:"address_line2"`
Recipient string `json:"recipient"`
}
// Address template in Czech Republic
type AddressCZ struct {
PostalCode string `json:"postal_code"` // usually 110 00 or 11000
City string `json:"city"` // e.g. Praha
Region string `json:"region"`
Street string `json:"street"` // may be omitted in some village-style addresses
HouseNumber string `json:"house_number"` // descriptive / conscription no.
OrientationNumber string `json:"orientation_number"` // optional, often after slash
AddressLine2 string `json:"address_line2"`
Recipient string `json:"recipient"`
}
// Address template in Germany
type AddressDE struct {
PostalCode string `json:"postal_code"` // e.g. 10115
City string `json:"city"` // e.g. Berlin
State string `json:"state"` // Bundesland, optional
Street string `json:"street"` // e.g. Unter den Linden
HouseNumber string `json:"house_number"` // e.g. 77, 12a
AddressLine2 string `json:"address_line2"` // extra details
Recipient string `json:"recipient"`
}

35
app/model/category.go Normal file
View File

@@ -0,0 +1,35 @@
package model
type ScannedCategory struct {
CategoryID uint `gorm:"column:category_id;primaryKey"`
Name string `gorm:"column:name"`
Active uint `gorm:"column:active"`
Position uint `gorm:"column:position"`
ParentID uint `gorm:"column:id_parent"`
IsRoot uint `gorm:"column:is_root_category"`
LinkRewrite string `gorm:"column:link_rewrite"`
IsoCode string `gorm:"column:iso_code"`
Visited bool // this is for internal backend use only
Filter string // filter applicable to this category
}
type Category struct {
CategoryID uint `json:"category_id" form:"category_id"`
Label string `json:"label" form:"label"`
// Active bool `json:"active" form:"active"`
Params CategoryParams `json:"params" form:"params"`
Children []Category `json:"children" form:"children"`
}
type CategoryParams struct {
CategoryID uint `json:"category_id" form:"category_id"`
LinkRewrite string `json:"link_rewrite" form:"link_rewrite"`
Locale string `json:"locale" form:"locale"`
Filter string `json:"filter" form:"filter"`
}
type CategoryInBreadcrumb struct {
CategoryID uint `json:"category_id" form:"category_id"`
Name string `json:"name" form:"name"`
}

View File

@@ -2,30 +2,14 @@ package model
// Represents a country together with its associated currency
type Country struct {
ID uint `gorm:"primaryKey;column:id" json:"id"`
Name string `gorm:"column:name" json:"name"`
Flag string `gorm:"size:16;not null;column:flag" json:"flag"`
CurrencyID uint `gorm:"column:id_currency" json:"currency_id"`
CurrencyISOCode string `gorm:"column:iso_code" json:"currency_iso_code"`
CurrencyName string `gorm:"column:name" json:"currency_name"`
// PSCountryID int `gorm:"column:id_country" json:"ps_country_id"`
// PSCountry *PSCountry `gorm:"foreignKey:PSCountryID;references:ID" json:"ps_country"`
PSCurrencyID uint `gorm:"column:currency" json:"currency"`
PSCurrency *PSCurrency `gorm:"foreignKey:PSCurrencyID;references:currency_id" json:"ps_currency"`
ID uint `gorm:"primaryKey;column:id" json:"id"`
Name string `gorm:"column:name" json:"name"`
Flag string `gorm:"size:16;not null;column:flag" json:"flag"`
CurrencyID uint `gorm:"column:b2b_id_currency" json:"currency_id"`
Currency *Currency `gorm:"foreignKey:CurrencyID" json:"currency,omitempty"`
}
func (Country) TableName() string {
return "b2b_countries"
}
type PSCountry struct {
CurrencyID uint `gorm:"column:id_currency" json:"currency_id"`
}
func (PSCountry) TableName() string {
return "ps_country"
}
type PSCurrency struct {
Currency int `gorm:"column:currency" json:"currency"`
}

25
app/model/currency.go Normal file
View File

@@ -0,0 +1,25 @@
package model
import "time"
type Currency struct {
ID int `json:"id"`
PsIDCurrency uint `json:"ps_id_currency"`
IsDefault bool `json:"is_default"`
IsActive bool `json:"is_active"`
ConversionRate *float64 `json:"conversion_rate,omitempty"`
}
func (Currency) TableName() string {
return "b2b_currencies"
}
type CurrencyRate struct {
B2bIdCurrency uint `json:"b2b_id_currency"`
CreatedAt time.Time `json:"created_at"`
ConversionRate *float64 `json:"conversion_rate,omitempty"`
}
func (CurrencyRate) TableName() string {
return "b2b_currency_rates"
}

View File

@@ -3,6 +3,7 @@ package model
import (
"time"
"git.ma-al.com/goc_daniel/b2b/app/delivery/middleware/perms"
"gorm.io/gorm"
)
@@ -13,7 +14,8 @@ type Customer struct {
Password string `gorm:"size:255" json:"-"` // Hashed password, not exposed in JSON
FirstName string `gorm:"size:100" json:"first_name"`
LastName string `gorm:"size:100" json:"last_name"`
Role CustomerRole `gorm:"type:varchar(20);default:'user'" json:"role"`
RoleID uint `gorm:"column:role_id;not null;default:1" json:"-"`
Role *Role `gorm:"foreignKey:RoleID" json:"role,omitempty"`
Provider AuthProvider `gorm:"type:varchar(20);default:'local'" json:"provider"`
ProviderID string `gorm:"size:255" json:"provider_id,omitempty"` // ID from OAuth provider
AvatarURL string `gorm:"size:500" json:"avatar_url,omitempty"`
@@ -23,22 +25,27 @@ type Customer struct {
EmailVerificationExpires *time.Time `json:"-"`
PasswordResetToken string `gorm:"size:255" json:"-"`
PasswordResetExpires *time.Time `json:"-"`
WebdavToken string `gorm:"size:255" json:"-"`
WebdavExpires *time.Time `json:"-"`
LastPasswordResetRequest *time.Time `json:"-"`
LastLoginAt *time.Time `json:"last_login_at,omitempty"`
LangID uint `gorm:"default:2" json:"lang_id"` // User's preferred language
CountryID uint `gorm:"default:2" json:"country_id"` // User's selected country
Country *Country `gorm:"foreignKey:CountryID" json:"country,omitempty"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
IsNoVat bool `gorm:"default:false" json:"is_no_vat"`
}
// CustomerRole represents the role of a user
type CustomerRole string
const (
RoleUser CustomerRole = "user"
RoleAdmin CustomerRole = "admin"
)
func (u *Customer) HasPermission(permission perms.Permission) bool {
for _, p := range u.Role.Permissions {
if p.Name == permission {
return true
}
}
return false
}
// AuthProvider represents the authentication provider
type AuthProvider string
@@ -53,16 +60,6 @@ func (Customer) TableName() string {
return "b2b_customers"
}
// IsAdmin checks if the user has admin role
func (u *Customer) IsAdmin() bool {
return u.Role == RoleAdmin
}
// CanManageUsers checks if the user can manage other users
func (u *Customer) CanManageUsers() bool {
return u.Role == RoleAdmin
}
// FullName returns the user's full name
func (u *Customer) FullName() string {
if u.FirstName == "" && u.LastName == "" {
@@ -73,29 +70,65 @@ func (u *Customer) FullName() string {
// UserSession represents a user session for JWT claims
type UserSession struct {
UserID uint `json:"user_id"`
Email string `json:"email"`
Username string `json:"username"`
Role CustomerRole `json:"role"`
LangID uint `json:"lang_id"`
CountryID uint `json:"country_id"`
UserID uint `json:"user_id"`
Email string `json:"email"`
Username string `json:"username"`
RoleID uint `json:"role_id"`
RoleName string `json:"role_name"`
LangID uint `json:"lang_id"`
CountryID uint `json:"country_id"`
IsActive bool `json:"is_active"`
Permissions []perms.Permission `json:"permissions"`
}
func (us *UserSession) HasPermission(permission perms.Permission) bool {
for _, p := range us.Permissions {
if p == permission {
return true
}
}
return false
}
type UserLocale struct {
// User is the Target user if present, otherwise same as Original.
// User ought to be used in applications
User *Customer
// Original user is the one associated with auth token
OriginalUser *Customer
// Importantly, lang_id used in application is stored as OriginalUser.LangID
}
// ToSession converts User to UserSession
func (u *Customer) ToSession() *UserSession {
return &UserSession{
UserID: u.ID,
Email: u.Email,
Role: u.Role,
LangID: u.LangID,
CountryID: u.CountryID,
UserID: u.ID,
Email: u.Email,
RoleID: u.Role.ID,
RoleName: u.Role.Name,
Permissions: BuildPermissionSlice(u),
LangID: u.LangID,
CountryID: u.CountryID,
IsActive: u.IsActive,
}
}
func BuildPermissionSlice(user *Customer) []perms.Permission {
var perms []perms.Permission
for _, p := range user.Role.Permissions {
perms = append(perms, p.Name)
}
return perms
}
// LoginRequest represents the login form data
type LoginRequest struct {
Email string `json:"email" form:"email"`
Password string `json:"password" form:"password"`
LangID *uint `json:"lang_id" form:"lang_id"`
}
// RegisterRequest represents the initial registration form data
@@ -142,3 +175,10 @@ type RefreshToken struct {
func (RefreshToken) TableName() string {
return "b2b_refresh_tokens"
}
type UserInList struct {
UserID uint `gorm:"primaryKey;column:id" json:"user_id"`
Email string `gorm:"column:email" json:"email"`
FirstName string `gorm:"column:first_name" json:"first_name"`
LastName string `gorm:"column:last_name" json:"last_name"`
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAccess = "ps_access"
@@ -16,3 +16,11 @@ type PsAccess struct {
func (*PsAccess) TableName() string {
return TableNamePsAccess
}
var PsAccessCols = struct {
IDProfile gormcol.Field
IDAuthorizationRole gormcol.Field
}{
IDProfile: gormcol.Field{}.Set((&PsAccess{}).TableName(), "id_profile"),
IDAuthorizationRole: gormcol.Field{}.Set((&PsAccess{}).TableName(), "id_authorization_role"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAccessory = "ps_accessory"
@@ -16,3 +16,11 @@ type PsAccessory struct {
func (*PsAccessory) TableName() string {
return TableNamePsAccessory
}
var PsAccessoryCols = struct {
IDProduct1 gormcol.Field
IDProduct2 gormcol.Field
}{
IDProduct1: gormcol.Field{}.Set((&PsAccessory{}).TableName(), "id_product_1"),
IDProduct2: gormcol.Field{}.Set((&PsAccessory{}).TableName(), "id_product_2"),
}

View File

@@ -0,0 +1,98 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
const TableNamePsAddress = "ps_address"
// PsAddress mapped from table <ps_address>
type PsAddress struct {
IDAddress int32 `gorm:"column:id_address;primaryKey;autoIncrement:true" json:"id_address"`
IDCountry int32 `gorm:"column:id_country;not null;index:id_country,priority:1" json:"id_country"`
IDState *int32 `gorm:"column:id_state;index:id_state,priority:1" json:"id_state"`
IDCustomer int32 `gorm:"column:id_customer;not null;index:address_customer,priority:1" json:"id_customer"`
IDManufacturer int32 `gorm:"column:id_manufacturer;not null;index:id_manufacturer,priority:1" json:"id_manufacturer"`
IDSupplier int32 `gorm:"column:id_supplier;not null;index:id_supplier,priority:1" json:"id_supplier"`
IDWarehouse int32 `gorm:"column:id_warehouse;not null;index:id_warehouse,priority:1" json:"id_warehouse"`
Alias string `gorm:"column:alias;not null" json:"alias"`
Company *string `gorm:"column:company" json:"company"`
Lastname string `gorm:"column:lastname;not null" json:"lastname"`
Firstname string `gorm:"column:firstname;not null" json:"firstname"`
Address1 string `gorm:"column:address1;not null" json:"address1"`
Address2 *string `gorm:"column:address2" json:"address2"`
Postcode *string `gorm:"column:postcode" json:"postcode"`
City string `gorm:"column:city;not null" json:"city"`
Other *string `gorm:"column:other" json:"other"`
Phone *string `gorm:"column:phone" json:"phone"`
PhoneMobile *string `gorm:"column:phone_mobile" json:"phone_mobile"`
VatNumber *string `gorm:"column:vat_number" json:"vat_number"`
Dni *string `gorm:"column:dni" json:"dni"`
DateAdd time.Time `gorm:"column:date_add;not null" json:"date_add"`
DateUpd time.Time `gorm:"column:date_upd;not null" json:"date_upd"`
Active bool `gorm:"column:active;not null;default:1" json:"active"`
Deleted bool `gorm:"column:deleted;not null" json:"deleted"`
IsNovat int32 `gorm:"column:is_novat;not null" json:"is_novat"`
}
// TableName PsAddress's table name
func (*PsAddress) TableName() string {
return TableNamePsAddress
}
var PsAddressCols = struct {
IDAddress gormcol.Field
IDCountry gormcol.Field
IDState gormcol.Field
IDCustomer gormcol.Field
IDManufacturer gormcol.Field
IDSupplier gormcol.Field
IDWarehouse gormcol.Field
Alias gormcol.Field
Company gormcol.Field
Lastname gormcol.Field
Firstname gormcol.Field
Address1 gormcol.Field
Address2 gormcol.Field
Postcode gormcol.Field
City gormcol.Field
Other gormcol.Field
Phone gormcol.Field
PhoneMobile gormcol.Field
VatNumber gormcol.Field
Dni gormcol.Field
DateAdd gormcol.Field
DateUpd gormcol.Field
Active gormcol.Field
Deleted gormcol.Field
IsNovat gormcol.Field
}{
IDAddress: gormcol.Field{}.Set((&PsAddress{}).TableName(), "id_address"),
IDCountry: gormcol.Field{}.Set((&PsAddress{}).TableName(), "id_country"),
IDState: gormcol.Field{}.Set((&PsAddress{}).TableName(), "id_state"),
IDCustomer: gormcol.Field{}.Set((&PsAddress{}).TableName(), "id_customer"),
IDManufacturer: gormcol.Field{}.Set((&PsAddress{}).TableName(), "id_manufacturer"),
IDSupplier: gormcol.Field{}.Set((&PsAddress{}).TableName(), "id_supplier"),
IDWarehouse: gormcol.Field{}.Set((&PsAddress{}).TableName(), "id_warehouse"),
Alias: gormcol.Field{}.Set((&PsAddress{}).TableName(), "alias"),
Company: gormcol.Field{}.Set((&PsAddress{}).TableName(), "company"),
Lastname: gormcol.Field{}.Set((&PsAddress{}).TableName(), "lastname"),
Firstname: gormcol.Field{}.Set((&PsAddress{}).TableName(), "firstname"),
Address1: gormcol.Field{}.Set((&PsAddress{}).TableName(), "address1"),
Address2: gormcol.Field{}.Set((&PsAddress{}).TableName(), "address2"),
Postcode: gormcol.Field{}.Set((&PsAddress{}).TableName(), "postcode"),
City: gormcol.Field{}.Set((&PsAddress{}).TableName(), "city"),
Other: gormcol.Field{}.Set((&PsAddress{}).TableName(), "other"),
Phone: gormcol.Field{}.Set((&PsAddress{}).TableName(), "phone"),
PhoneMobile: gormcol.Field{}.Set((&PsAddress{}).TableName(), "phone_mobile"),
VatNumber: gormcol.Field{}.Set((&PsAddress{}).TableName(), "vat_number"),
Dni: gormcol.Field{}.Set((&PsAddress{}).TableName(), "dni"),
DateAdd: gormcol.Field{}.Set((&PsAddress{}).TableName(), "date_add"),
DateUpd: gormcol.Field{}.Set((&PsAddress{}).TableName(), "date_upd"),
Active: gormcol.Field{}.Set((&PsAddress{}).TableName(), "active"),
Deleted: gormcol.Field{}.Set((&PsAddress{}).TableName(), "deleted"),
IsNovat: gormcol.Field{}.Set((&PsAddress{}).TableName(), "is_novat"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAddressFormat = "ps_address_format"
@@ -16,3 +16,11 @@ type PsAddressFormat struct {
func (*PsAddressFormat) TableName() string {
return TableNamePsAddressFormat
}
var PsAddressFormatCols = struct {
IDCountry gormcol.Field
Format gormcol.Field
}{
IDCountry: gormcol.Field{}.Set((&PsAddressFormat{}).TableName(), "id_country"),
Format: gormcol.Field{}.Set((&PsAddressFormat{}).TableName(), "format"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAdminFilter = "ps_admin_filter"
@@ -21,3 +21,21 @@ type PsAdminFilter struct {
func (*PsAdminFilter) TableName() string {
return TableNamePsAdminFilter
}
var PsAdminFilterCols = struct {
ID gormcol.Field
Employee gormcol.Field
Shop gormcol.Field
Controller gormcol.Field
Action gormcol.Field
Filter gormcol.Field
FilterID gormcol.Field
}{
ID: gormcol.Field{}.Set((&PsAdminFilter{}).TableName(), "id"),
Employee: gormcol.Field{}.Set((&PsAdminFilter{}).TableName(), "employee"),
Shop: gormcol.Field{}.Set((&PsAdminFilter{}).TableName(), "shop"),
Controller: gormcol.Field{}.Set((&PsAdminFilter{}).TableName(), "controller"),
Action: gormcol.Field{}.Set((&PsAdminFilter{}).TableName(), "action"),
Filter: gormcol.Field{}.Set((&PsAdminFilter{}).TableName(), "filter"),
FilterID: gormcol.Field{}.Set((&PsAdminFilter{}).TableName(), "filter_id"),
}

View File

@@ -0,0 +1,53 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAdvice = "ps_advice"
// PsAdvice mapped from table <ps_advice>
type PsAdvice struct {
IDAdvice int32 `gorm:"column:id_advice;primaryKey;autoIncrement:true" json:"id_advice"`
IDPsAdvice int32 `gorm:"column:id_ps_advice;not null" json:"id_ps_advice"`
IDTab int32 `gorm:"column:id_tab;not null" json:"id_tab"`
IdsTab *string `gorm:"column:ids_tab" json:"ids_tab"`
Validated bool `gorm:"column:validated;not null" json:"validated"`
Hide bool `gorm:"column:hide;not null" json:"hide"`
Location string `gorm:"column:location;not null" json:"location"`
Selector *string `gorm:"column:selector" json:"selector"`
StartDay int32 `gorm:"column:start_day;not null" json:"start_day"`
StopDay int32 `gorm:"column:stop_day;not null" json:"stop_day"`
Weight *int32 `gorm:"column:weight;default:1" json:"weight"`
}
// TableName PsAdvice's table name
func (*PsAdvice) TableName() string {
return TableNamePsAdvice
}
var PsAdviceCols = struct {
IDAdvice gormcol.Field
IDPsAdvice gormcol.Field
IDTab gormcol.Field
IdsTab gormcol.Field
Validated gormcol.Field
Hide gormcol.Field
Location gormcol.Field
Selector gormcol.Field
StartDay gormcol.Field
StopDay gormcol.Field
Weight gormcol.Field
}{
IDAdvice: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "id_advice"),
IDPsAdvice: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "id_ps_advice"),
IDTab: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "id_tab"),
IdsTab: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "ids_tab"),
Validated: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "validated"),
Hide: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "hide"),
Location: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "location"),
Selector: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "selector"),
StartDay: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "start_day"),
StopDay: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "stop_day"),
Weight: gormcol.Field{}.Set((&PsAdvice{}).TableName(), "weight"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAdviceLang = "ps_advice_lang"
@@ -17,3 +17,13 @@ type PsAdviceLang struct {
func (*PsAdviceLang) TableName() string {
return TableNamePsAdviceLang
}
var PsAdviceLangCols = struct {
IDAdvice gormcol.Field
IDLang gormcol.Field
HTML gormcol.Field
}{
IDAdvice: gormcol.Field{}.Set((&PsAdviceLang{}).TableName(), "id_advice"),
IDLang: gormcol.Field{}.Set((&PsAdviceLang{}).TableName(), "id_lang"),
HTML: gormcol.Field{}.Set((&PsAdviceLang{}).TableName(), "html"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAlias = "ps_alias"
@@ -18,3 +18,15 @@ type PsAlias struct {
func (*PsAlias) TableName() string {
return TableNamePsAlias
}
var PsAliasCols = struct {
IDAlias gormcol.Field
Alias gormcol.Field
Search gormcol.Field
Active gormcol.Field
}{
IDAlias: gormcol.Field{}.Set((&PsAlias{}).TableName(), "id_alias"),
Alias: gormcol.Field{}.Set((&PsAlias{}).TableName(), "alias"),
Search: gormcol.Field{}.Set((&PsAlias{}).TableName(), "search"),
Active: gormcol.Field{}.Set((&PsAlias{}).TableName(), "active"),
}

View File

@@ -0,0 +1,35 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAttachment = "ps_attachment"
// PsAttachment mapped from table <ps_attachment>
type PsAttachment struct {
IDAttachment int32 `gorm:"column:id_attachment;primaryKey;autoIncrement:true" json:"id_attachment"`
File string `gorm:"column:file;not null" json:"file"`
FileName string `gorm:"column:file_name;not null" json:"file_name"`
FileSize int64 `gorm:"column:file_size;not null" json:"file_size"`
Mime string `gorm:"column:mime;not null" json:"mime"`
}
// TableName PsAttachment's table name
func (*PsAttachment) TableName() string {
return TableNamePsAttachment
}
var PsAttachmentCols = struct {
IDAttachment gormcol.Field
File gormcol.Field
FileName gormcol.Field
FileSize gormcol.Field
Mime gormcol.Field
}{
IDAttachment: gormcol.Field{}.Set((&PsAttachment{}).TableName(), "id_attachment"),
File: gormcol.Field{}.Set((&PsAttachment{}).TableName(), "file"),
FileName: gormcol.Field{}.Set((&PsAttachment{}).TableName(), "file_name"),
FileSize: gormcol.Field{}.Set((&PsAttachment{}).TableName(), "file_size"),
Mime: gormcol.Field{}.Set((&PsAttachment{}).TableName(), "mime"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAttachmentLang = "ps_attachment_lang"
@@ -18,3 +18,15 @@ type PsAttachmentLang struct {
func (*PsAttachmentLang) TableName() string {
return TableNamePsAttachmentLang
}
var PsAttachmentLangCols = struct {
IDAttachment gormcol.Field
IDLang gormcol.Field
Name gormcol.Field
Description gormcol.Field
}{
IDAttachment: gormcol.Field{}.Set((&PsAttachmentLang{}).TableName(), "id_attachment"),
IDLang: gormcol.Field{}.Set((&PsAttachmentLang{}).TableName(), "id_lang"),
Name: gormcol.Field{}.Set((&PsAttachmentLang{}).TableName(), "name"),
Description: gormcol.Field{}.Set((&PsAttachmentLang{}).TableName(), "description"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAttribute = "ps_attribute"
@@ -18,3 +18,15 @@ type PsAttribute struct {
func (*PsAttribute) TableName() string {
return TableNamePsAttribute
}
var PsAttributeCols = struct {
IDAttribute gormcol.Field
IDAttributeGroup gormcol.Field
Color gormcol.Field
Position gormcol.Field
}{
IDAttribute: gormcol.Field{}.Set((&PsAttribute{}).TableName(), "id_attribute"),
IDAttributeGroup: gormcol.Field{}.Set((&PsAttribute{}).TableName(), "id_attribute_group"),
Color: gormcol.Field{}.Set((&PsAttribute{}).TableName(), "color"),
Position: gormcol.Field{}.Set((&PsAttribute{}).TableName(), "position"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAttributeGroup = "ps_attribute_group"
@@ -18,3 +18,15 @@ type PsAttributeGroup struct {
func (*PsAttributeGroup) TableName() string {
return TableNamePsAttributeGroup
}
var PsAttributeGroupCols = struct {
IDAttributeGroup gormcol.Field
IsColorGroup gormcol.Field
GroupType gormcol.Field
Position gormcol.Field
}{
IDAttributeGroup: gormcol.Field{}.Set((&PsAttributeGroup{}).TableName(), "id_attribute_group"),
IsColorGroup: gormcol.Field{}.Set((&PsAttributeGroup{}).TableName(), "is_color_group"),
GroupType: gormcol.Field{}.Set((&PsAttributeGroup{}).TableName(), "group_type"),
Position: gormcol.Field{}.Set((&PsAttributeGroup{}).TableName(), "position"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAttributeGroupLang = "ps_attribute_group_lang"
@@ -18,3 +18,15 @@ type PsAttributeGroupLang struct {
func (*PsAttributeGroupLang) TableName() string {
return TableNamePsAttributeGroupLang
}
var PsAttributeGroupLangCols = struct {
IDAttributeGroup gormcol.Field
IDLang gormcol.Field
Name gormcol.Field
PublicName gormcol.Field
}{
IDAttributeGroup: gormcol.Field{}.Set((&PsAttributeGroupLang{}).TableName(), "id_attribute_group"),
IDLang: gormcol.Field{}.Set((&PsAttributeGroupLang{}).TableName(), "id_lang"),
Name: gormcol.Field{}.Set((&PsAttributeGroupLang{}).TableName(), "name"),
PublicName: gormcol.Field{}.Set((&PsAttributeGroupLang{}).TableName(), "public_name"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAttributeGroupShop = "ps_attribute_group_shop"
@@ -16,3 +16,11 @@ type PsAttributeGroupShop struct {
func (*PsAttributeGroupShop) TableName() string {
return TableNamePsAttributeGroupShop
}
var PsAttributeGroupShopCols = struct {
IDAttributeGroup gormcol.Field
IDShop gormcol.Field
}{
IDAttributeGroup: gormcol.Field{}.Set((&PsAttributeGroupShop{}).TableName(), "id_attribute_group"),
IDShop: gormcol.Field{}.Set((&PsAttributeGroupShop{}).TableName(), "id_shop"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAttributeImpact = "ps_attribute_impact"
@@ -19,3 +19,17 @@ type PsAttributeImpact struct {
func (*PsAttributeImpact) TableName() string {
return TableNamePsAttributeImpact
}
var PsAttributeImpactCols = struct {
IDAttributeImpact gormcol.Field
IDProduct gormcol.Field
IDAttribute gormcol.Field
Weight gormcol.Field
Price gormcol.Field
}{
IDAttributeImpact: gormcol.Field{}.Set((&PsAttributeImpact{}).TableName(), "id_attribute_impact"),
IDProduct: gormcol.Field{}.Set((&PsAttributeImpact{}).TableName(), "id_product"),
IDAttribute: gormcol.Field{}.Set((&PsAttributeImpact{}).TableName(), "id_attribute"),
Weight: gormcol.Field{}.Set((&PsAttributeImpact{}).TableName(), "weight"),
Price: gormcol.Field{}.Set((&PsAttributeImpact{}).TableName(), "price"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAttributeLang = "ps_attribute_lang"
@@ -17,3 +17,13 @@ type PsAttributeLang struct {
func (*PsAttributeLang) TableName() string {
return TableNamePsAttributeLang
}
var PsAttributeLangCols = struct {
IDAttribute gormcol.Field
IDLang gormcol.Field
Name gormcol.Field
}{
IDAttribute: gormcol.Field{}.Set((&PsAttributeLang{}).TableName(), "id_attribute"),
IDLang: gormcol.Field{}.Set((&PsAttributeLang{}).TableName(), "id_lang"),
Name: gormcol.Field{}.Set((&PsAttributeLang{}).TableName(), "name"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAttributeShop = "ps_attribute_shop"
@@ -16,3 +16,11 @@ type PsAttributeShop struct {
func (*PsAttributeShop) TableName() string {
return TableNamePsAttributeShop
}
var PsAttributeShopCols = struct {
IDAttribute gormcol.Field
IDShop gormcol.Field
}{
IDAttribute: gormcol.Field{}.Set((&PsAttributeShop{}).TableName(), "id_attribute"),
IDShop: gormcol.Field{}.Set((&PsAttributeShop{}).TableName(), "id_shop"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsAuthorizationRole = "ps_authorization_role"
@@ -16,3 +16,11 @@ type PsAuthorizationRole struct {
func (*PsAuthorizationRole) TableName() string {
return TableNamePsAuthorizationRole
}
var PsAuthorizationRoleCols = struct {
IDAuthorizationRole gormcol.Field
Slug gormcol.Field
}{
IDAuthorizationRole: gormcol.Field{}.Set((&PsAuthorizationRole{}).TableName(), "id_authorization_role"),
Slug: gormcol.Field{}.Set((&PsAuthorizationRole{}).TableName(), "slug"),
}

View File

@@ -0,0 +1,44 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsBadge = "ps_badge"
// PsBadge mapped from table <ps_badge>
type PsBadge struct {
IDBadge int32 `gorm:"column:id_badge;primaryKey;autoIncrement:true" json:"id_badge"`
IDPsBadge int32 `gorm:"column:id_ps_badge;not null" json:"id_ps_badge"`
Type string `gorm:"column:type;not null" json:"type"`
IDGroup int32 `gorm:"column:id_group;not null" json:"id_group"`
GroupPosition int32 `gorm:"column:group_position;not null" json:"group_position"`
Scoring int32 `gorm:"column:scoring;not null" json:"scoring"`
Awb *int32 `gorm:"column:awb" json:"awb"`
Validated bool `gorm:"column:validated;not null" json:"validated"`
}
// TableName PsBadge's table name
func (*PsBadge) TableName() string {
return TableNamePsBadge
}
var PsBadgeCols = struct {
IDBadge gormcol.Field
IDPsBadge gormcol.Field
Type gormcol.Field
IDGroup gormcol.Field
GroupPosition gormcol.Field
Scoring gormcol.Field
Awb gormcol.Field
Validated gormcol.Field
}{
IDBadge: gormcol.Field{}.Set((&PsBadge{}).TableName(), "id_badge"),
IDPsBadge: gormcol.Field{}.Set((&PsBadge{}).TableName(), "id_ps_badge"),
Type: gormcol.Field{}.Set((&PsBadge{}).TableName(), "type"),
IDGroup: gormcol.Field{}.Set((&PsBadge{}).TableName(), "id_group"),
GroupPosition: gormcol.Field{}.Set((&PsBadge{}).TableName(), "group_position"),
Scoring: gormcol.Field{}.Set((&PsBadge{}).TableName(), "scoring"),
Awb: gormcol.Field{}.Set((&PsBadge{}).TableName(), "awb"),
Validated: gormcol.Field{}.Set((&PsBadge{}).TableName(), "validated"),
}

View File

@@ -0,0 +1,35 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsBadgeLang = "ps_badge_lang"
// PsBadgeLang mapped from table <ps_badge_lang>
type PsBadgeLang struct {
IDBadge int32 `gorm:"column:id_badge;primaryKey" json:"id_badge"`
IDLang int32 `gorm:"column:id_lang;primaryKey" json:"id_lang"`
Name *string `gorm:"column:name" json:"name"`
Description *string `gorm:"column:description" json:"description"`
GroupName *string `gorm:"column:group_name" json:"group_name"`
}
// TableName PsBadgeLang's table name
func (*PsBadgeLang) TableName() string {
return TableNamePsBadgeLang
}
var PsBadgeLangCols = struct {
IDBadge gormcol.Field
IDLang gormcol.Field
Name gormcol.Field
Description gormcol.Field
GroupName gormcol.Field
}{
IDBadge: gormcol.Field{}.Set((&PsBadgeLang{}).TableName(), "id_badge"),
IDLang: gormcol.Field{}.Set((&PsBadgeLang{}).TableName(), "id_lang"),
Name: gormcol.Field{}.Set((&PsBadgeLang{}).TableName(), "name"),
Description: gormcol.Field{}.Set((&PsBadgeLang{}).TableName(), "description"),
GroupName: gormcol.Field{}.Set((&PsBadgeLang{}).TableName(), "group_name"),
}

View File

@@ -0,0 +1,83 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCarrier = "ps_carrier"
// PsCarrier mapped from table <ps_carrier>
type PsCarrier struct {
IDCarrier int32 `gorm:"column:id_carrier;primaryKey;autoIncrement:true" json:"id_carrier"`
IDReference int32 `gorm:"column:id_reference;not null;index:reference,priority:1" json:"id_reference"`
IDTaxRulesGroup *int32 `gorm:"column:id_tax_rules_group;index:id_tax_rules_group,priority:1" json:"id_tax_rules_group"`
Name string `gorm:"column:name;not null" json:"name"`
URL *string `gorm:"column:url" json:"url"`
Active bool `gorm:"column:active;not null;index:deleted,priority:2;index:reference,priority:3" json:"active"`
Deleted bool `gorm:"column:deleted;not null;index:deleted,priority:1;index:reference,priority:2" json:"deleted"`
ShippingHandling bool `gorm:"column:shipping_handling;not null;default:1" json:"shipping_handling"`
RangeBehavior bool `gorm:"column:range_behavior;not null" json:"range_behavior"`
IsModule bool `gorm:"column:is_module;not null" json:"is_module"`
IsFree bool `gorm:"column:is_free;not null" json:"is_free"`
ShippingExternal bool `gorm:"column:shipping_external;not null" json:"shipping_external"`
NeedRange bool `gorm:"column:need_range;not null" json:"need_range"`
ExternalModuleName *string `gorm:"column:external_module_name" json:"external_module_name"`
ShippingMethod int32 `gorm:"column:shipping_method;not null" json:"shipping_method"`
Position int32 `gorm:"column:position;not null" json:"position"`
MaxWidth *int32 `gorm:"column:max_width" json:"max_width"`
MaxHeight *int32 `gorm:"column:max_height" json:"max_height"`
MaxDepth *int32 `gorm:"column:max_depth" json:"max_depth"`
MaxWeight *float64 `gorm:"column:max_weight;default:0.000000" json:"max_weight"`
Grade *int32 `gorm:"column:grade" json:"grade"`
}
// TableName PsCarrier's table name
func (*PsCarrier) TableName() string {
return TableNamePsCarrier
}
var PsCarrierCols = struct {
IDCarrier gormcol.Field
IDReference gormcol.Field
IDTaxRulesGroup gormcol.Field
Name gormcol.Field
URL gormcol.Field
Active gormcol.Field
Deleted gormcol.Field
ShippingHandling gormcol.Field
RangeBehavior gormcol.Field
IsModule gormcol.Field
IsFree gormcol.Field
ShippingExternal gormcol.Field
NeedRange gormcol.Field
ExternalModuleName gormcol.Field
ShippingMethod gormcol.Field
Position gormcol.Field
MaxWidth gormcol.Field
MaxHeight gormcol.Field
MaxDepth gormcol.Field
MaxWeight gormcol.Field
Grade gormcol.Field
}{
IDCarrier: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "id_carrier"),
IDReference: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "id_reference"),
IDTaxRulesGroup: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "id_tax_rules_group"),
Name: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "name"),
URL: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "url"),
Active: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "active"),
Deleted: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "deleted"),
ShippingHandling: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "shipping_handling"),
RangeBehavior: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "range_behavior"),
IsModule: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "is_module"),
IsFree: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "is_free"),
ShippingExternal: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "shipping_external"),
NeedRange: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "need_range"),
ExternalModuleName: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "external_module_name"),
ShippingMethod: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "shipping_method"),
Position: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "position"),
MaxWidth: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "max_width"),
MaxHeight: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "max_height"),
MaxDepth: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "max_depth"),
MaxWeight: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "max_weight"),
Grade: gormcol.Field{}.Set((&PsCarrier{}).TableName(), "grade"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCarrierGroup = "ps_carrier_group"
@@ -16,3 +16,11 @@ type PsCarrierGroup struct {
func (*PsCarrierGroup) TableName() string {
return TableNamePsCarrierGroup
}
var PsCarrierGroupCols = struct {
IDCarrier gormcol.Field
IDGroup gormcol.Field
}{
IDCarrier: gormcol.Field{}.Set((&PsCarrierGroup{}).TableName(), "id_carrier"),
IDGroup: gormcol.Field{}.Set((&PsCarrierGroup{}).TableName(), "id_group"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCarrierLang = "ps_carrier_lang"
@@ -18,3 +18,15 @@ type PsCarrierLang struct {
func (*PsCarrierLang) TableName() string {
return TableNamePsCarrierLang
}
var PsCarrierLangCols = struct {
IDCarrier gormcol.Field
IDShop gormcol.Field
IDLang gormcol.Field
Delay gormcol.Field
}{
IDCarrier: gormcol.Field{}.Set((&PsCarrierLang{}).TableName(), "id_carrier"),
IDShop: gormcol.Field{}.Set((&PsCarrierLang{}).TableName(), "id_shop"),
IDLang: gormcol.Field{}.Set((&PsCarrierLang{}).TableName(), "id_lang"),
Delay: gormcol.Field{}.Set((&PsCarrierLang{}).TableName(), "delay"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCarrierShop = "ps_carrier_shop"
@@ -16,3 +16,11 @@ type PsCarrierShop struct {
func (*PsCarrierShop) TableName() string {
return TableNamePsCarrierShop
}
var PsCarrierShopCols = struct {
IDCarrier gormcol.Field
IDShop gormcol.Field
}{
IDCarrier: gormcol.Field{}.Set((&PsCarrierShop{}).TableName(), "id_carrier"),
IDShop: gormcol.Field{}.Set((&PsCarrierShop{}).TableName(), "id_shop"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCarrierTaxRulesGroupShop = "ps_carrier_tax_rules_group_shop"
@@ -17,3 +17,13 @@ type PsCarrierTaxRulesGroupShop struct {
func (*PsCarrierTaxRulesGroupShop) TableName() string {
return TableNamePsCarrierTaxRulesGroupShop
}
var PsCarrierTaxRulesGroupShopCols = struct {
IDCarrier gormcol.Field
IDTaxRulesGroup gormcol.Field
IDShop gormcol.Field
}{
IDCarrier: gormcol.Field{}.Set((&PsCarrierTaxRulesGroupShop{}).TableName(), "id_carrier"),
IDTaxRulesGroup: gormcol.Field{}.Set((&PsCarrierTaxRulesGroupShop{}).TableName(), "id_tax_rules_group"),
IDShop: gormcol.Field{}.Set((&PsCarrierTaxRulesGroupShop{}).TableName(), "id_shop"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCarrierZone = "ps_carrier_zone"
@@ -16,3 +16,11 @@ type PsCarrierZone struct {
func (*PsCarrierZone) TableName() string {
return TableNamePsCarrierZone
}
var PsCarrierZoneCols = struct {
IDCarrier gormcol.Field
IDZone gormcol.Field
}{
IDCarrier: gormcol.Field{}.Set((&PsCarrierZone{}).TableName(), "id_carrier"),
IDZone: gormcol.Field{}.Set((&PsCarrierZone{}).TableName(), "id_zone"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -41,3 +40,53 @@ type PsCart struct {
func (*PsCart) TableName() string {
return TableNamePsCart
}
var PsCartCols = struct {
IDCart gormcol.Field
IDShopGroup gormcol.Field
IDShop gormcol.Field
IDCarrier gormcol.Field
DeliveryOption gormcol.Field
IDLang gormcol.Field
IDAddressDelivery gormcol.Field
IDAddressInvoice gormcol.Field
IDCurrency gormcol.Field
IDCustomer gormcol.Field
IDGuest gormcol.Field
SecureKey gormcol.Field
Recyclable gormcol.Field
Gift gormcol.Field
GiftMessage gormcol.Field
MobileTheme gormcol.Field
AllowSeperatedPackage gormcol.Field
DateAdd gormcol.Field
DateUpd gormcol.Field
CheckoutSessionData gormcol.Field
CustomeShippingPriceNetto gormcol.Field
CustomeShippingPrice gormcol.Field
CustomeShippingTaxRate gormcol.Field
}{
IDCart: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_cart"),
IDShopGroup: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_shop_group"),
IDShop: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_shop"),
IDCarrier: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_carrier"),
DeliveryOption: gormcol.Field{}.Set((&PsCart{}).TableName(), "delivery_option"),
IDLang: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_lang"),
IDAddressDelivery: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_address_delivery"),
IDAddressInvoice: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_address_invoice"),
IDCurrency: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_currency"),
IDCustomer: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_customer"),
IDGuest: gormcol.Field{}.Set((&PsCart{}).TableName(), "id_guest"),
SecureKey: gormcol.Field{}.Set((&PsCart{}).TableName(), "secure_key"),
Recyclable: gormcol.Field{}.Set((&PsCart{}).TableName(), "recyclable"),
Gift: gormcol.Field{}.Set((&PsCart{}).TableName(), "gift"),
GiftMessage: gormcol.Field{}.Set((&PsCart{}).TableName(), "gift_message"),
MobileTheme: gormcol.Field{}.Set((&PsCart{}).TableName(), "mobile_theme"),
AllowSeperatedPackage: gormcol.Field{}.Set((&PsCart{}).TableName(), "allow_seperated_package"),
DateAdd: gormcol.Field{}.Set((&PsCart{}).TableName(), "date_add"),
DateUpd: gormcol.Field{}.Set((&PsCart{}).TableName(), "date_upd"),
CheckoutSessionData: gormcol.Field{}.Set((&PsCart{}).TableName(), "checkout_session_data"),
CustomeShippingPriceNetto: gormcol.Field{}.Set((&PsCart{}).TableName(), "custome_shipping_price_netto"),
CustomeShippingPrice: gormcol.Field{}.Set((&PsCart{}).TableName(), "custome_shipping_price"),
CustomeShippingTaxRate: gormcol.Field{}.Set((&PsCart{}).TableName(), "custome_shipping_tax_rate"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartCartRule = "ps_cart_cart_rule"
@@ -16,3 +16,11 @@ type PsCartCartRule struct {
func (*PsCartCartRule) TableName() string {
return TableNamePsCartCartRule
}
var PsCartCartRuleCols = struct {
IDCart gormcol.Field
IDCartRule gormcol.Field
}{
IDCart: gormcol.Field{}.Set((&PsCartCartRule{}).TableName(), "id_cart"),
IDCartRule: gormcol.Field{}.Set((&PsCartCartRule{}).TableName(), "id_cart_rule"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -26,3 +25,23 @@ type PsCartProduct struct {
func (*PsCartProduct) TableName() string {
return TableNamePsCartProduct
}
var PsCartProductCols = struct {
IDCart gormcol.Field
IDProduct gormcol.Field
IDAddressDelivery gormcol.Field
IDShop gormcol.Field
IDProductAttribute gormcol.Field
IDCustomization gormcol.Field
Quantity gormcol.Field
DateAdd gormcol.Field
}{
IDCart: gormcol.Field{}.Set((&PsCartProduct{}).TableName(), "id_cart"),
IDProduct: gormcol.Field{}.Set((&PsCartProduct{}).TableName(), "id_product"),
IDAddressDelivery: gormcol.Field{}.Set((&PsCartProduct{}).TableName(), "id_address_delivery"),
IDShop: gormcol.Field{}.Set((&PsCartProduct{}).TableName(), "id_shop"),
IDProductAttribute: gormcol.Field{}.Set((&PsCartProduct{}).TableName(), "id_product_attribute"),
IDCustomization: gormcol.Field{}.Set((&PsCartProduct{}).TableName(), "id_customization"),
Quantity: gormcol.Field{}.Set((&PsCartProduct{}).TableName(), "quantity"),
DateAdd: gormcol.Field{}.Set((&PsCartProduct{}).TableName(), "date_add"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -51,3 +50,73 @@ type PsCartRule struct {
func (*PsCartRule) TableName() string {
return TableNamePsCartRule
}
var PsCartRuleCols = struct {
IDCartRule gormcol.Field
IDCustomer gormcol.Field
DateFrom gormcol.Field
DateTo gormcol.Field
Description gormcol.Field
Quantity gormcol.Field
QuantityPerUser gormcol.Field
Priority gormcol.Field
PartialUse gormcol.Field
Code gormcol.Field
MinimumAmount gormcol.Field
MinimumAmountTax gormcol.Field
MinimumAmountCurrency gormcol.Field
MinimumAmountShipping gormcol.Field
CountryRestriction gormcol.Field
CarrierRestriction gormcol.Field
GroupRestriction gormcol.Field
CartRuleRestriction gormcol.Field
ProductRestriction gormcol.Field
ShopRestriction gormcol.Field
FreeShipping gormcol.Field
ReductionPercent gormcol.Field
ReductionAmount gormcol.Field
ReductionTax gormcol.Field
ReductionCurrency gormcol.Field
ReductionProduct gormcol.Field
ReductionExcludeSpecial gormcol.Field
GiftProduct gormcol.Field
GiftProductAttribute gormcol.Field
Highlight gormcol.Field
Active gormcol.Field
DateAdd gormcol.Field
DateUpd gormcol.Field
}{
IDCartRule: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "id_cart_rule"),
IDCustomer: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "id_customer"),
DateFrom: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "date_from"),
DateTo: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "date_to"),
Description: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "description"),
Quantity: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "quantity"),
QuantityPerUser: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "quantity_per_user"),
Priority: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "priority"),
PartialUse: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "partial_use"),
Code: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "code"),
MinimumAmount: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "minimum_amount"),
MinimumAmountTax: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "minimum_amount_tax"),
MinimumAmountCurrency: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "minimum_amount_currency"),
MinimumAmountShipping: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "minimum_amount_shipping"),
CountryRestriction: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "country_restriction"),
CarrierRestriction: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "carrier_restriction"),
GroupRestriction: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "group_restriction"),
CartRuleRestriction: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "cart_rule_restriction"),
ProductRestriction: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "product_restriction"),
ShopRestriction: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "shop_restriction"),
FreeShipping: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "free_shipping"),
ReductionPercent: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "reduction_percent"),
ReductionAmount: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "reduction_amount"),
ReductionTax: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "reduction_tax"),
ReductionCurrency: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "reduction_currency"),
ReductionProduct: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "reduction_product"),
ReductionExcludeSpecial: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "reduction_exclude_special"),
GiftProduct: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "gift_product"),
GiftProductAttribute: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "gift_product_attribute"),
Highlight: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "highlight"),
Active: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "active"),
DateAdd: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "date_add"),
DateUpd: gormcol.Field{}.Set((&PsCartRule{}).TableName(), "date_upd"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartRuleCarrier = "ps_cart_rule_carrier"
@@ -16,3 +16,11 @@ type PsCartRuleCarrier struct {
func (*PsCartRuleCarrier) TableName() string {
return TableNamePsCartRuleCarrier
}
var PsCartRuleCarrierCols = struct {
IDCartRule gormcol.Field
IDCarrier gormcol.Field
}{
IDCartRule: gormcol.Field{}.Set((&PsCartRuleCarrier{}).TableName(), "id_cart_rule"),
IDCarrier: gormcol.Field{}.Set((&PsCartRuleCarrier{}).TableName(), "id_carrier"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartRuleCombination = "ps_cart_rule_combination"
@@ -16,3 +16,11 @@ type PsCartRuleCombination struct {
func (*PsCartRuleCombination) TableName() string {
return TableNamePsCartRuleCombination
}
var PsCartRuleCombinationCols = struct {
IDCartRule1 gormcol.Field
IDCartRule2 gormcol.Field
}{
IDCartRule1: gormcol.Field{}.Set((&PsCartRuleCombination{}).TableName(), "id_cart_rule_1"),
IDCartRule2: gormcol.Field{}.Set((&PsCartRuleCombination{}).TableName(), "id_cart_rule_2"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartRuleCountry = "ps_cart_rule_country"
@@ -16,3 +16,11 @@ type PsCartRuleCountry struct {
func (*PsCartRuleCountry) TableName() string {
return TableNamePsCartRuleCountry
}
var PsCartRuleCountryCols = struct {
IDCartRule gormcol.Field
IDCountry gormcol.Field
}{
IDCartRule: gormcol.Field{}.Set((&PsCartRuleCountry{}).TableName(), "id_cart_rule"),
IDCountry: gormcol.Field{}.Set((&PsCartRuleCountry{}).TableName(), "id_country"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartRuleGroup = "ps_cart_rule_group"
@@ -16,3 +16,11 @@ type PsCartRuleGroup struct {
func (*PsCartRuleGroup) TableName() string {
return TableNamePsCartRuleGroup
}
var PsCartRuleGroupCols = struct {
IDCartRule gormcol.Field
IDGroup gormcol.Field
}{
IDCartRule: gormcol.Field{}.Set((&PsCartRuleGroup{}).TableName(), "id_cart_rule"),
IDGroup: gormcol.Field{}.Set((&PsCartRuleGroup{}).TableName(), "id_group"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartRuleLang = "ps_cart_rule_lang"
@@ -17,3 +17,13 @@ type PsCartRuleLang struct {
func (*PsCartRuleLang) TableName() string {
return TableNamePsCartRuleLang
}
var PsCartRuleLangCols = struct {
IDCartRule gormcol.Field
IDLang gormcol.Field
Name gormcol.Field
}{
IDCartRule: gormcol.Field{}.Set((&PsCartRuleLang{}).TableName(), "id_cart_rule"),
IDLang: gormcol.Field{}.Set((&PsCartRuleLang{}).TableName(), "id_lang"),
Name: gormcol.Field{}.Set((&PsCartRuleLang{}).TableName(), "name"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartRuleProductRule = "ps_cart_rule_product_rule"
@@ -17,3 +17,13 @@ type PsCartRuleProductRule struct {
func (*PsCartRuleProductRule) TableName() string {
return TableNamePsCartRuleProductRule
}
var PsCartRuleProductRuleCols = struct {
IDProductRule gormcol.Field
IDProductRuleGroup gormcol.Field
Type gormcol.Field
}{
IDProductRule: gormcol.Field{}.Set((&PsCartRuleProductRule{}).TableName(), "id_product_rule"),
IDProductRuleGroup: gormcol.Field{}.Set((&PsCartRuleProductRule{}).TableName(), "id_product_rule_group"),
Type: gormcol.Field{}.Set((&PsCartRuleProductRule{}).TableName(), "type"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartRuleProductRuleGroup = "ps_cart_rule_product_rule_group"
@@ -17,3 +17,13 @@ type PsCartRuleProductRuleGroup struct {
func (*PsCartRuleProductRuleGroup) TableName() string {
return TableNamePsCartRuleProductRuleGroup
}
var PsCartRuleProductRuleGroupCols = struct {
IDProductRuleGroup gormcol.Field
IDCartRule gormcol.Field
Quantity gormcol.Field
}{
IDProductRuleGroup: gormcol.Field{}.Set((&PsCartRuleProductRuleGroup{}).TableName(), "id_product_rule_group"),
IDCartRule: gormcol.Field{}.Set((&PsCartRuleProductRuleGroup{}).TableName(), "id_cart_rule"),
Quantity: gormcol.Field{}.Set((&PsCartRuleProductRuleGroup{}).TableName(), "quantity"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartRuleProductRuleValue = "ps_cart_rule_product_rule_value"
@@ -16,3 +16,11 @@ type PsCartRuleProductRuleValue struct {
func (*PsCartRuleProductRuleValue) TableName() string {
return TableNamePsCartRuleProductRuleValue
}
var PsCartRuleProductRuleValueCols = struct {
IDProductRule gormcol.Field
IDItem gormcol.Field
}{
IDProductRule: gormcol.Field{}.Set((&PsCartRuleProductRuleValue{}).TableName(), "id_product_rule"),
IDItem: gormcol.Field{}.Set((&PsCartRuleProductRuleValue{}).TableName(), "id_item"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCartRuleShop = "ps_cart_rule_shop"
@@ -16,3 +16,11 @@ type PsCartRuleShop struct {
func (*PsCartRuleShop) TableName() string {
return TableNamePsCartRuleShop
}
var PsCartRuleShopCols = struct {
IDCartRule gormcol.Field
IDShop gormcol.Field
}{
IDCartRule: gormcol.Field{}.Set((&PsCartRuleShop{}).TableName(), "id_cart_rule"),
IDShop: gormcol.Field{}.Set((&PsCartRuleShop{}).TableName(), "id_shop"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -29,3 +28,29 @@ type PsCategory struct {
func (*PsCategory) TableName() string {
return TableNamePsCategory
}
var PsCategoryCols = struct {
IDCategory gormcol.Field
IDParent gormcol.Field
IDShopDefault gormcol.Field
LevelDepth gormcol.Field
Nleft gormcol.Field
Nright gormcol.Field
Active gormcol.Field
DateAdd gormcol.Field
DateUpd gormcol.Field
Position gormcol.Field
IsRootCategory gormcol.Field
}{
IDCategory: gormcol.Field{}.Set((&PsCategory{}).TableName(), "id_category"),
IDParent: gormcol.Field{}.Set((&PsCategory{}).TableName(), "id_parent"),
IDShopDefault: gormcol.Field{}.Set((&PsCategory{}).TableName(), "id_shop_default"),
LevelDepth: gormcol.Field{}.Set((&PsCategory{}).TableName(), "level_depth"),
Nleft: gormcol.Field{}.Set((&PsCategory{}).TableName(), "nleft"),
Nright: gormcol.Field{}.Set((&PsCategory{}).TableName(), "nright"),
Active: gormcol.Field{}.Set((&PsCategory{}).TableName(), "active"),
DateAdd: gormcol.Field{}.Set((&PsCategory{}).TableName(), "date_add"),
DateUpd: gormcol.Field{}.Set((&PsCategory{}).TableName(), "date_upd"),
Position: gormcol.Field{}.Set((&PsCategory{}).TableName(), "position"),
IsRootCategory: gormcol.Field{}.Set((&PsCategory{}).TableName(), "is_root_category"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCategoryGroup = "ps_category_group"
@@ -16,3 +16,11 @@ type PsCategoryGroup struct {
func (*PsCategoryGroup) TableName() string {
return TableNamePsCategoryGroup
}
var PsCategoryGroupCols = struct {
IDCategory gormcol.Field
IDGroup gormcol.Field
}{
IDCategory: gormcol.Field{}.Set((&PsCategoryGroup{}).TableName(), "id_category"),
IDGroup: gormcol.Field{}.Set((&PsCategoryGroup{}).TableName(), "id_group"),
}

View File

@@ -0,0 +1,47 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCategoryLang = "ps_category_lang"
// PsCategoryLang mapped from table <ps_category_lang>
type PsCategoryLang struct {
IDCategory int32 `gorm:"column:id_category;primaryKey" json:"id_category"`
IDShop int32 `gorm:"column:id_shop;primaryKey;default:1" json:"id_shop"`
IDLang int32 `gorm:"column:id_lang;primaryKey" json:"id_lang"`
Name string `gorm:"column:name;not null;index:category_name,priority:1" json:"name"`
Description *string `gorm:"column:description" json:"description"`
LinkRewrite string `gorm:"column:link_rewrite;not null" json:"link_rewrite"`
MetaTitle *string `gorm:"column:meta_title" json:"meta_title"`
MetaKeywords *string `gorm:"column:meta_keywords" json:"meta_keywords"`
MetaDescription *string `gorm:"column:meta_description" json:"meta_description"`
}
// TableName PsCategoryLang's table name
func (*PsCategoryLang) TableName() string {
return TableNamePsCategoryLang
}
var PsCategoryLangCols = struct {
IDCategory gormcol.Field
IDShop gormcol.Field
IDLang gormcol.Field
Name gormcol.Field
Description gormcol.Field
LinkRewrite gormcol.Field
MetaTitle gormcol.Field
MetaKeywords gormcol.Field
MetaDescription gormcol.Field
}{
IDCategory: gormcol.Field{}.Set((&PsCategoryLang{}).TableName(), "id_category"),
IDShop: gormcol.Field{}.Set((&PsCategoryLang{}).TableName(), "id_shop"),
IDLang: gormcol.Field{}.Set((&PsCategoryLang{}).TableName(), "id_lang"),
Name: gormcol.Field{}.Set((&PsCategoryLang{}).TableName(), "name"),
Description: gormcol.Field{}.Set((&PsCategoryLang{}).TableName(), "description"),
LinkRewrite: gormcol.Field{}.Set((&PsCategoryLang{}).TableName(), "link_rewrite"),
MetaTitle: gormcol.Field{}.Set((&PsCategoryLang{}).TableName(), "meta_title"),
MetaKeywords: gormcol.Field{}.Set((&PsCategoryLang{}).TableName(), "meta_keywords"),
MetaDescription: gormcol.Field{}.Set((&PsCategoryLang{}).TableName(), "meta_description"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCategoryProduct = "ps_category_product"
@@ -17,3 +17,13 @@ type PsCategoryProduct struct {
func (*PsCategoryProduct) TableName() string {
return TableNamePsCategoryProduct
}
var PsCategoryProductCols = struct {
IDCategory gormcol.Field
IDProduct gormcol.Field
Position gormcol.Field
}{
IDCategory: gormcol.Field{}.Set((&PsCategoryProduct{}).TableName(), "id_category"),
IDProduct: gormcol.Field{}.Set((&PsCategoryProduct{}).TableName(), "id_product"),
Position: gormcol.Field{}.Set((&PsCategoryProduct{}).TableName(), "position"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCategoryShop = "ps_category_shop"
@@ -17,3 +17,13 @@ type PsCategoryShop struct {
func (*PsCategoryShop) TableName() string {
return TableNamePsCategoryShop
}
var PsCategoryShopCols = struct {
IDCategory gormcol.Field
IDShop gormcol.Field
Position gormcol.Field
}{
IDCategory: gormcol.Field{}.Set((&PsCategoryShop{}).TableName(), "id_category"),
IDShop: gormcol.Field{}.Set((&PsCategoryShop{}).TableName(), "id_shop"),
Position: gormcol.Field{}.Set((&PsCategoryShop{}).TableName(), "position"),
}

View File

@@ -0,0 +1,35 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCm = "ps_cms"
// PsCm mapped from table <ps_cms>
type PsCm struct {
IDCms int32 `gorm:"column:id_cms;primaryKey;autoIncrement:true" json:"id_cms"`
IDCmsCategory int32 `gorm:"column:id_cms_category;not null" json:"id_cms_category"`
Position int32 `gorm:"column:position;not null" json:"position"`
Active bool `gorm:"column:active;not null" json:"active"`
Indexation bool `gorm:"column:indexation;not null;default:1" json:"indexation"`
}
// TableName PsCm's table name
func (*PsCm) TableName() string {
return TableNamePsCm
}
var PsCmCols = struct {
IDCms gormcol.Field
IDCmsCategory gormcol.Field
Position gormcol.Field
Active gormcol.Field
Indexation gormcol.Field
}{
IDCms: gormcol.Field{}.Set((&PsCm{}).TableName(), "id_cms"),
IDCmsCategory: gormcol.Field{}.Set((&PsCm{}).TableName(), "id_cms_category"),
Position: gormcol.Field{}.Set((&PsCm{}).TableName(), "position"),
Active: gormcol.Field{}.Set((&PsCm{}).TableName(), "active"),
Indexation: gormcol.Field{}.Set((&PsCm{}).TableName(), "indexation"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -25,3 +24,21 @@ type PsCmsCategory struct {
func (*PsCmsCategory) TableName() string {
return TableNamePsCmsCategory
}
var PsCmsCategoryCols = struct {
IDCmsCategory gormcol.Field
IDParent gormcol.Field
LevelDepth gormcol.Field
Active gormcol.Field
DateAdd gormcol.Field
DateUpd gormcol.Field
Position gormcol.Field
}{
IDCmsCategory: gormcol.Field{}.Set((&PsCmsCategory{}).TableName(), "id_cms_category"),
IDParent: gormcol.Field{}.Set((&PsCmsCategory{}).TableName(), "id_parent"),
LevelDepth: gormcol.Field{}.Set((&PsCmsCategory{}).TableName(), "level_depth"),
Active: gormcol.Field{}.Set((&PsCmsCategory{}).TableName(), "active"),
DateAdd: gormcol.Field{}.Set((&PsCmsCategory{}).TableName(), "date_add"),
DateUpd: gormcol.Field{}.Set((&PsCmsCategory{}).TableName(), "date_upd"),
Position: gormcol.Field{}.Set((&PsCmsCategory{}).TableName(), "position"),
}

View File

@@ -0,0 +1,47 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCmsCategoryLang = "ps_cms_category_lang"
// PsCmsCategoryLang mapped from table <ps_cms_category_lang>
type PsCmsCategoryLang struct {
IDCmsCategory int32 `gorm:"column:id_cms_category;primaryKey" json:"id_cms_category"`
IDLang int32 `gorm:"column:id_lang;primaryKey" json:"id_lang"`
IDShop int32 `gorm:"column:id_shop;primaryKey;default:1" json:"id_shop"`
Name string `gorm:"column:name;not null;index:category_name,priority:1" json:"name"`
Description *string `gorm:"column:description" json:"description"`
LinkRewrite string `gorm:"column:link_rewrite;not null" json:"link_rewrite"`
MetaTitle *string `gorm:"column:meta_title" json:"meta_title"`
MetaKeywords *string `gorm:"column:meta_keywords" json:"meta_keywords"`
MetaDescription *string `gorm:"column:meta_description" json:"meta_description"`
}
// TableName PsCmsCategoryLang's table name
func (*PsCmsCategoryLang) TableName() string {
return TableNamePsCmsCategoryLang
}
var PsCmsCategoryLangCols = struct {
IDCmsCategory gormcol.Field
IDLang gormcol.Field
IDShop gormcol.Field
Name gormcol.Field
Description gormcol.Field
LinkRewrite gormcol.Field
MetaTitle gormcol.Field
MetaKeywords gormcol.Field
MetaDescription gormcol.Field
}{
IDCmsCategory: gormcol.Field{}.Set((&PsCmsCategoryLang{}).TableName(), "id_cms_category"),
IDLang: gormcol.Field{}.Set((&PsCmsCategoryLang{}).TableName(), "id_lang"),
IDShop: gormcol.Field{}.Set((&PsCmsCategoryLang{}).TableName(), "id_shop"),
Name: gormcol.Field{}.Set((&PsCmsCategoryLang{}).TableName(), "name"),
Description: gormcol.Field{}.Set((&PsCmsCategoryLang{}).TableName(), "description"),
LinkRewrite: gormcol.Field{}.Set((&PsCmsCategoryLang{}).TableName(), "link_rewrite"),
MetaTitle: gormcol.Field{}.Set((&PsCmsCategoryLang{}).TableName(), "meta_title"),
MetaKeywords: gormcol.Field{}.Set((&PsCmsCategoryLang{}).TableName(), "meta_keywords"),
MetaDescription: gormcol.Field{}.Set((&PsCmsCategoryLang{}).TableName(), "meta_description"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCmsCategoryShop = "ps_cms_category_shop"
@@ -16,3 +16,11 @@ type PsCmsCategoryShop struct {
func (*PsCmsCategoryShop) TableName() string {
return TableNamePsCmsCategoryShop
}
var PsCmsCategoryShopCols = struct {
IDCmsCategory gormcol.Field
IDShop gormcol.Field
}{
IDCmsCategory: gormcol.Field{}.Set((&PsCmsCategoryShop{}).TableName(), "id_cms_category"),
IDShop: gormcol.Field{}.Set((&PsCmsCategoryShop{}).TableName(), "id_shop"),
}

View File

@@ -0,0 +1,47 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCmsLang = "ps_cms_lang"
// PsCmsLang mapped from table <ps_cms_lang>
type PsCmsLang struct {
IDCms int32 `gorm:"column:id_cms;primaryKey" json:"id_cms"`
IDLang int32 `gorm:"column:id_lang;primaryKey" json:"id_lang"`
IDShop int32 `gorm:"column:id_shop;primaryKey;default:1" json:"id_shop"`
MetaTitle string `gorm:"column:meta_title;not null" json:"meta_title"`
HeadSeoTitle *string `gorm:"column:head_seo_title" json:"head_seo_title"`
MetaDescription *string `gorm:"column:meta_description" json:"meta_description"`
MetaKeywords *string `gorm:"column:meta_keywords" json:"meta_keywords"`
Content *string `gorm:"column:content" json:"content"`
LinkRewrite string `gorm:"column:link_rewrite;not null" json:"link_rewrite"`
}
// TableName PsCmsLang's table name
func (*PsCmsLang) TableName() string {
return TableNamePsCmsLang
}
var PsCmsLangCols = struct {
IDCms gormcol.Field
IDLang gormcol.Field
IDShop gormcol.Field
MetaTitle gormcol.Field
HeadSeoTitle gormcol.Field
MetaDescription gormcol.Field
MetaKeywords gormcol.Field
Content gormcol.Field
LinkRewrite gormcol.Field
}{
IDCms: gormcol.Field{}.Set((&PsCmsLang{}).TableName(), "id_cms"),
IDLang: gormcol.Field{}.Set((&PsCmsLang{}).TableName(), "id_lang"),
IDShop: gormcol.Field{}.Set((&PsCmsLang{}).TableName(), "id_shop"),
MetaTitle: gormcol.Field{}.Set((&PsCmsLang{}).TableName(), "meta_title"),
HeadSeoTitle: gormcol.Field{}.Set((&PsCmsLang{}).TableName(), "head_seo_title"),
MetaDescription: gormcol.Field{}.Set((&PsCmsLang{}).TableName(), "meta_description"),
MetaKeywords: gormcol.Field{}.Set((&PsCmsLang{}).TableName(), "meta_keywords"),
Content: gormcol.Field{}.Set((&PsCmsLang{}).TableName(), "content"),
LinkRewrite: gormcol.Field{}.Set((&PsCmsLang{}).TableName(), "link_rewrite"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCmsRole = "ps_cms_role"
@@ -17,3 +17,13 @@ type PsCmsRole struct {
func (*PsCmsRole) TableName() string {
return TableNamePsCmsRole
}
var PsCmsRoleCols = struct {
IDCmsRole gormcol.Field
Name gormcol.Field
IDCms gormcol.Field
}{
IDCmsRole: gormcol.Field{}.Set((&PsCmsRole{}).TableName(), "id_cms_role"),
Name: gormcol.Field{}.Set((&PsCmsRole{}).TableName(), "name"),
IDCms: gormcol.Field{}.Set((&PsCmsRole{}).TableName(), "id_cms"),
}

View File

@@ -0,0 +1,32 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCmsRoleLang = "ps_cms_role_lang"
// PsCmsRoleLang mapped from table <ps_cms_role_lang>
type PsCmsRoleLang struct {
IDCmsRole int32 `gorm:"column:id_cms_role;primaryKey" json:"id_cms_role"`
IDLang int32 `gorm:"column:id_lang;primaryKey" json:"id_lang"`
IDShop int32 `gorm:"column:id_shop;primaryKey" json:"id_shop"`
Name *string `gorm:"column:name" json:"name"`
}
// TableName PsCmsRoleLang's table name
func (*PsCmsRoleLang) TableName() string {
return TableNamePsCmsRoleLang
}
var PsCmsRoleLangCols = struct {
IDCmsRole gormcol.Field
IDLang gormcol.Field
IDShop gormcol.Field
Name gormcol.Field
}{
IDCmsRole: gormcol.Field{}.Set((&PsCmsRoleLang{}).TableName(), "id_cms_role"),
IDLang: gormcol.Field{}.Set((&PsCmsRoleLang{}).TableName(), "id_lang"),
IDShop: gormcol.Field{}.Set((&PsCmsRoleLang{}).TableName(), "id_shop"),
Name: gormcol.Field{}.Set((&PsCmsRoleLang{}).TableName(), "name"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsCmsShop = "ps_cms_shop"
@@ -16,3 +16,11 @@ type PsCmsShop struct {
func (*PsCmsShop) TableName() string {
return TableNamePsCmsShop
}
var PsCmsShopCols = struct {
IDCms gormcol.Field
IDShop gormcol.Field
}{
IDCms: gormcol.Field{}.Set((&PsCmsShop{}).TableName(), "id_cms"),
IDShop: gormcol.Field{}.Set((&PsCmsShop{}).TableName(), "id_shop"),
}

View File

@@ -0,0 +1,59 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
const TableNamePsCondition = "ps_condition"
// PsCondition mapped from table <ps_condition>
type PsCondition struct {
IDCondition int32 `gorm:"column:id_condition;primaryKey;autoIncrement:true" json:"id_condition"`
IDPsCondition int32 `gorm:"column:id_ps_condition;primaryKey" json:"id_ps_condition"`
Type string `gorm:"column:type;not null" json:"type"`
Request *string `gorm:"column:request" json:"request"`
Operator *string `gorm:"column:operator" json:"operator"`
Value *string `gorm:"column:value" json:"value"`
Result *string `gorm:"column:result" json:"result"`
CalculationType *string `gorm:"column:calculation_type" json:"calculation_type"`
CalculationDetail *string `gorm:"column:calculation_detail" json:"calculation_detail"`
Validated bool `gorm:"column:validated;not null" json:"validated"`
DateAdd time.Time `gorm:"column:date_add;not null" json:"date_add"`
DateUpd time.Time `gorm:"column:date_upd;not null" json:"date_upd"`
}
// TableName PsCondition's table name
func (*PsCondition) TableName() string {
return TableNamePsCondition
}
var PsConditionCols = struct {
IDCondition gormcol.Field
IDPsCondition gormcol.Field
Type gormcol.Field
Request gormcol.Field
Operator gormcol.Field
Value gormcol.Field
Result gormcol.Field
CalculationType gormcol.Field
CalculationDetail gormcol.Field
Validated gormcol.Field
DateAdd gormcol.Field
DateUpd gormcol.Field
}{
IDCondition: gormcol.Field{}.Set((&PsCondition{}).TableName(), "id_condition"),
IDPsCondition: gormcol.Field{}.Set((&PsCondition{}).TableName(), "id_ps_condition"),
Type: gormcol.Field{}.Set((&PsCondition{}).TableName(), "type"),
Request: gormcol.Field{}.Set((&PsCondition{}).TableName(), "request"),
Operator: gormcol.Field{}.Set((&PsCondition{}).TableName(), "operator"),
Value: gormcol.Field{}.Set((&PsCondition{}).TableName(), "value"),
Result: gormcol.Field{}.Set((&PsCondition{}).TableName(), "result"),
CalculationType: gormcol.Field{}.Set((&PsCondition{}).TableName(), "calculation_type"),
CalculationDetail: gormcol.Field{}.Set((&PsCondition{}).TableName(), "calculation_detail"),
Validated: gormcol.Field{}.Set((&PsCondition{}).TableName(), "validated"),
DateAdd: gormcol.Field{}.Set((&PsCondition{}).TableName(), "date_add"),
DateUpd: gormcol.Field{}.Set((&PsCondition{}).TableName(), "date_upd"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsConditionAdvice = "ps_condition_advice"
@@ -17,3 +17,13 @@ type PsConditionAdvice struct {
func (*PsConditionAdvice) TableName() string {
return TableNamePsConditionAdvice
}
var PsConditionAdviceCols = struct {
IDCondition gormcol.Field
IDAdvice gormcol.Field
Display gormcol.Field
}{
IDCondition: gormcol.Field{}.Set((&PsConditionAdvice{}).TableName(), "id_condition"),
IDAdvice: gormcol.Field{}.Set((&PsConditionAdvice{}).TableName(), "id_advice"),
Display: gormcol.Field{}.Set((&PsConditionAdvice{}).TableName(), "display"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsConditionBadge = "ps_condition_badge"
@@ -16,3 +16,11 @@ type PsConditionBadge struct {
func (*PsConditionBadge) TableName() string {
return TableNamePsConditionBadge
}
var PsConditionBadgeCols = struct {
IDCondition gormcol.Field
IDBadge gormcol.Field
}{
IDCondition: gormcol.Field{}.Set((&PsConditionBadge{}).TableName(), "id_condition"),
IDBadge: gormcol.Field{}.Set((&PsConditionBadge{}).TableName(), "id_badge"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -25,3 +24,21 @@ type PsConfiguration struct {
func (*PsConfiguration) TableName() string {
return TableNamePsConfiguration
}
var PsConfigurationCols = struct {
IDConfiguration gormcol.Field
IDShopGroup gormcol.Field
IDShop gormcol.Field
Name gormcol.Field
Value gormcol.Field
DateAdd gormcol.Field
DateUpd gormcol.Field
}{
IDConfiguration: gormcol.Field{}.Set((&PsConfiguration{}).TableName(), "id_configuration"),
IDShopGroup: gormcol.Field{}.Set((&PsConfiguration{}).TableName(), "id_shop_group"),
IDShop: gormcol.Field{}.Set((&PsConfiguration{}).TableName(), "id_shop"),
Name: gormcol.Field{}.Set((&PsConfiguration{}).TableName(), "name"),
Value: gormcol.Field{}.Set((&PsConfiguration{}).TableName(), "value"),
DateAdd: gormcol.Field{}.Set((&PsConfiguration{}).TableName(), "date_add"),
DateUpd: gormcol.Field{}.Set((&PsConfiguration{}).TableName(), "date_upd"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -25,3 +24,21 @@ type PsConfigurationKpi struct {
func (*PsConfigurationKpi) TableName() string {
return TableNamePsConfigurationKpi
}
var PsConfigurationKpiCols = struct {
IDConfigurationKpi gormcol.Field
IDShopGroup gormcol.Field
IDShop gormcol.Field
Name gormcol.Field
Value gormcol.Field
DateAdd gormcol.Field
DateUpd gormcol.Field
}{
IDConfigurationKpi: gormcol.Field{}.Set((&PsConfigurationKpi{}).TableName(), "id_configuration_kpi"),
IDShopGroup: gormcol.Field{}.Set((&PsConfigurationKpi{}).TableName(), "id_shop_group"),
IDShop: gormcol.Field{}.Set((&PsConfigurationKpi{}).TableName(), "id_shop"),
Name: gormcol.Field{}.Set((&PsConfigurationKpi{}).TableName(), "name"),
Value: gormcol.Field{}.Set((&PsConfigurationKpi{}).TableName(), "value"),
DateAdd: gormcol.Field{}.Set((&PsConfigurationKpi{}).TableName(), "date_add"),
DateUpd: gormcol.Field{}.Set((&PsConfigurationKpi{}).TableName(), "date_upd"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -22,3 +21,15 @@ type PsConfigurationKpiLang struct {
func (*PsConfigurationKpiLang) TableName() string {
return TableNamePsConfigurationKpiLang
}
var PsConfigurationKpiLangCols = struct {
IDConfigurationKpi gormcol.Field
IDLang gormcol.Field
Value gormcol.Field
DateUpd gormcol.Field
}{
IDConfigurationKpi: gormcol.Field{}.Set((&PsConfigurationKpiLang{}).TableName(), "id_configuration_kpi"),
IDLang: gormcol.Field{}.Set((&PsConfigurationKpiLang{}).TableName(), "id_lang"),
Value: gormcol.Field{}.Set((&PsConfigurationKpiLang{}).TableName(), "value"),
DateUpd: gormcol.Field{}.Set((&PsConfigurationKpiLang{}).TableName(), "date_upd"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -22,3 +21,15 @@ type PsConfigurationLang struct {
func (*PsConfigurationLang) TableName() string {
return TableNamePsConfigurationLang
}
var PsConfigurationLangCols = struct {
IDConfiguration gormcol.Field
IDLang gormcol.Field
Value gormcol.Field
DateUpd gormcol.Field
}{
IDConfiguration: gormcol.Field{}.Set((&PsConfigurationLang{}).TableName(), "id_configuration"),
IDLang: gormcol.Field{}.Set((&PsConfigurationLang{}).TableName(), "id_lang"),
Value: gormcol.Field{}.Set((&PsConfigurationLang{}).TableName(), "value"),
DateUpd: gormcol.Field{}.Set((&PsConfigurationLang{}).TableName(), "date_upd"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -26,3 +25,23 @@ type PsConnection struct {
func (*PsConnection) TableName() string {
return TableNamePsConnection
}
var PsConnectionCols = struct {
IDConnections gormcol.Field
IDShopGroup gormcol.Field
IDShop gormcol.Field
IDGuest gormcol.Field
IDPage gormcol.Field
IPAddress gormcol.Field
DateAdd gormcol.Field
HTTPReferer gormcol.Field
}{
IDConnections: gormcol.Field{}.Set((&PsConnection{}).TableName(), "id_connections"),
IDShopGroup: gormcol.Field{}.Set((&PsConnection{}).TableName(), "id_shop_group"),
IDShop: gormcol.Field{}.Set((&PsConnection{}).TableName(), "id_shop"),
IDGuest: gormcol.Field{}.Set((&PsConnection{}).TableName(), "id_guest"),
IDPage: gormcol.Field{}.Set((&PsConnection{}).TableName(), "id_page"),
IPAddress: gormcol.Field{}.Set((&PsConnection{}).TableName(), "ip_address"),
DateAdd: gormcol.Field{}.Set((&PsConnection{}).TableName(), "date_add"),
HTTPReferer: gormcol.Field{}.Set((&PsConnection{}).TableName(), "http_referer"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -22,3 +21,15 @@ type PsConnectionsPage struct {
func (*PsConnectionsPage) TableName() string {
return TableNamePsConnectionsPage
}
var PsConnectionsPageCols = struct {
IDConnections gormcol.Field
IDPage gormcol.Field
TimeStart gormcol.Field
TimeEnd gormcol.Field
}{
IDConnections: gormcol.Field{}.Set((&PsConnectionsPage{}).TableName(), "id_connections"),
IDPage: gormcol.Field{}.Set((&PsConnectionsPage{}).TableName(), "id_page"),
TimeStart: gormcol.Field{}.Set((&PsConnectionsPage{}).TableName(), "time_start"),
TimeEnd: gormcol.Field{}.Set((&PsConnectionsPage{}).TableName(), "time_end"),
}

View File

@@ -1,10 +1,9 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import (
"git.ma-al.com/goc_marek/gormcol"
"time"
)
@@ -24,3 +23,19 @@ type PsConnectionsSource struct {
func (*PsConnectionsSource) TableName() string {
return TableNamePsConnectionsSource
}
var PsConnectionsSourceCols = struct {
IDConnectionsSource gormcol.Field
IDConnections gormcol.Field
HTTPReferer gormcol.Field
RequestURI gormcol.Field
Keywords gormcol.Field
DateAdd gormcol.Field
}{
IDConnectionsSource: gormcol.Field{}.Set((&PsConnectionsSource{}).TableName(), "id_connections_source"),
IDConnections: gormcol.Field{}.Set((&PsConnectionsSource{}).TableName(), "id_connections"),
HTTPReferer: gormcol.Field{}.Set((&PsConnectionsSource{}).TableName(), "http_referer"),
RequestURI: gormcol.Field{}.Set((&PsConnectionsSource{}).TableName(), "request_uri"),
Keywords: gormcol.Field{}.Set((&PsConnectionsSource{}).TableName(), "keywords"),
DateAdd: gormcol.Field{}.Set((&PsConnectionsSource{}).TableName(), "date_add"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsContact = "ps_contact"
@@ -18,3 +18,15 @@ type PsContact struct {
func (*PsContact) TableName() string {
return TableNamePsContact
}
var PsContactCols = struct {
IDContact gormcol.Field
Email gormcol.Field
CustomerService gormcol.Field
Position gormcol.Field
}{
IDContact: gormcol.Field{}.Set((&PsContact{}).TableName(), "id_contact"),
Email: gormcol.Field{}.Set((&PsContact{}).TableName(), "email"),
CustomerService: gormcol.Field{}.Set((&PsContact{}).TableName(), "customer_service"),
Position: gormcol.Field{}.Set((&PsContact{}).TableName(), "position"),
}

View File

@@ -0,0 +1,32 @@
// Code generated by gormcol. DO NOT EDIT.
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsContactLang = "ps_contact_lang"
// PsContactLang mapped from table <ps_contact_lang>
type PsContactLang struct {
IDContact int32 `gorm:"column:id_contact;primaryKey" json:"id_contact"`
IDLang int32 `gorm:"column:id_lang;primaryKey" json:"id_lang"`
Name string `gorm:"column:name;not null" json:"name"`
Description *string `gorm:"column:description" json:"description"`
}
// TableName PsContactLang's table name
func (*PsContactLang) TableName() string {
return TableNamePsContactLang
}
var PsContactLangCols = struct {
IDContact gormcol.Field
IDLang gormcol.Field
Name gormcol.Field
Description gormcol.Field
}{
IDContact: gormcol.Field{}.Set((&PsContactLang{}).TableName(), "id_contact"),
IDLang: gormcol.Field{}.Set((&PsContactLang{}).TableName(), "id_lang"),
Name: gormcol.Field{}.Set((&PsContactLang{}).TableName(), "name"),
Description: gormcol.Field{}.Set((&PsContactLang{}).TableName(), "description"),
}

View File

@@ -1,8 +1,8 @@
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gorm.io/gen. DO NOT EDIT.
// Code generated by gormcol. DO NOT EDIT.
package prestadb
package dbmodel
import "git.ma-al.com/goc_marek/gormcol"
const TableNamePsContactShop = "ps_contact_shop"
@@ -16,3 +16,11 @@ type PsContactShop struct {
func (*PsContactShop) TableName() string {
return TableNamePsContactShop
}
var PsContactShopCols = struct {
IDContact gormcol.Field
IDShop gormcol.Field
}{
IDContact: gormcol.Field{}.Set((&PsContactShop{}).TableName(), "id_contact"),
IDShop: gormcol.Field{}.Set((&PsContactShop{}).TableName(), "id_shop"),
}

Some files were not shown because too many files have changed in this diff Show More