diff --git a/ee/scripts/helm/db/init_dbs/postgresql/1.5.1/1.5.1.sql b/ee/scripts/helm/db/init_dbs/postgresql/1.5.1/1.5.1.sql
index 48a326e9c..c2bd0594e 100644
--- a/ee/scripts/helm/db/init_dbs/postgresql/1.5.1/1.5.1.sql
+++ b/ee/scripts/helm/db/init_dbs/postgresql/1.5.1/1.5.1.sql
@@ -5,4 +5,36 @@ $$
SELECT 'v1.5.1-ee'
$$ LANGUAGE sql IMMUTABLE;
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'AC';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'AN';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'BU';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'CP';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'CS';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'CT';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'DD';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'DG';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'DY';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'EA';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'FQ';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'FX';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'HV';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'IC';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'JT';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'MI';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'NH';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'NQ';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'NT';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'PC';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'PU';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'PZ';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'RH';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'SU';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'TA';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'TP';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'VD';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'WK';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'YD';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'YU';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'ZR';
+
COMMIT;
\ No newline at end of file
diff --git a/ee/scripts/helm/db/init_dbs/postgresql/init_schema.sql b/ee/scripts/helm/db/init_dbs/postgresql/init_schema.sql
index ffa83689c..a6ceddf35 100644
--- a/ee/scripts/helm/db/init_dbs/postgresql/init_schema.sql
+++ b/ee/scripts/helm/db/init_dbs/postgresql/init_schema.sql
@@ -7,7 +7,7 @@ CREATE EXTENSION IF NOT EXISTS pgcrypto;
CREATE OR REPLACE FUNCTION openreplay_version()
RETURNS text AS
$$
-SELECT 'v1.5.0-ee'
+SELECT 'v1.5.1-ee'
$$ LANGUAGE sql IMMUTABLE;
@@ -569,7 +569,7 @@ $$
IF NOT EXISTS(SELECT *
FROM pg_type typ
WHERE typ.typname = 'country') THEN
- CREATE TYPE country AS ENUM ('UN','RW','SO','YE','IQ','SA','IR','CY','TZ','SY','AM','KE','CD','DJ','UG','CF','SC','JO','LB','KW','OM','QA','BH','AE','IL','TR','ET','ER','EG','SD','GR','BI','EE','LV','AZ','LT','SJ','GE','MD','BY','FI','AX','UA','MK','HU','BG','AL','PL','RO','XK','ZW','ZM','KM','MW','LS','BW','MU','SZ','RE','ZA','YT','MZ','MG','AF','PK','BD','TM','TJ','LK','BT','IN','MV','IO','NP','MM','UZ','KZ','KG','TF','HM','CC','PW','VN','TH','ID','LA','TW','PH','MY','CN','HK','BN','MO','KH','KR','JP','KP','SG','CK','TL','RU','MN','AU','CX','MH','FM','PG','SB','TV','NR','VU','NC','NF','NZ','FJ','LY','CM','SN','CG','PT','LR','CI','GH','GQ','NG','BF','TG','GW','MR','BJ','GA','SL','ST','GI','GM','GN','TD','NE','ML','EH','TN','ES','MA','MT','DZ','FO','DK','IS','GB','CH','SE','NL','AT','BE','DE','LU','IE','MC','FR','AD','LI','JE','IM','GG','SK','CZ','NO','VA','SM','IT','SI','ME','HR','BA','AO','NA','SH','BV','BB','CV','GY','GF','SR','PM','GL','PY','UY','BR','FK','GS','JM','DO','CU','MQ','BS','BM','AI','TT','KN','DM','AG','LC','TC','AW','VG','VC','MS','MF','BL','GP','GD','KY','BZ','SV','GT','HN','NI','CR','VE','EC','CO','PA','HT','AR','CL','BO','PE','MX','PF','PN','KI','TK','TO','WF','WS','NU','MP','GU','PR','VI','UM','AS','CA','US','PS','RS','AQ','SX','CW','BQ','SS');
+ CREATE TYPE country AS ENUM ('UN','RW','SO','YE','IQ','SA','IR','CY','TZ','SY','AM','KE','CD','DJ','UG','CF','SC','JO','LB','KW','OM','QA','BH','AE','IL','TR','ET','ER','EG','SD','GR','BI','EE','LV','AZ','LT','SJ','GE','MD','BY','FI','AX','UA','MK','HU','BG','AL','PL','RO','XK','ZW','ZM','KM','MW','LS','BW','MU','SZ','RE','ZA','YT','MZ','MG','AF','PK','BD','TM','TJ','LK','BT','IN','MV','IO','NP','MM','UZ','KZ','KG','TF','HM','CC','PW','VN','TH','ID','LA','TW','PH','MY','CN','HK','BN','MO','KH','KR','JP','KP','SG','CK','TL','RU','MN','AU','CX','MH','FM','PG','SB','TV','NR','VU','NC','NF','NZ','FJ','LY','CM','SN','CG','PT','LR','CI','GH','GQ','NG','BF','TG','GW','MR','BJ','GA','SL','ST','GI','GM','GN','TD','NE','ML','EH','TN','ES','MA','MT','DZ','FO','DK','IS','GB','CH','SE','NL','AT','BE','DE','LU','IE','MC','FR','AD','LI','JE','IM','GG','SK','CZ','NO','VA','SM','IT','SI','ME','HR','BA','AO','NA','SH','BV','BB','CV','GY','GF','SR','PM','GL','PY','UY','BR','FK','GS','JM','DO','CU','MQ','BS','BM','AI','TT','KN','DM','AG','LC','TC','AW','VG','VC','MS','MF','BL','GP','GD','KY','BZ','SV','GT','HN','NI','CR','VE','EC','CO','PA','HT','AR','CL','BO','PE','MX','PF','PN','KI','TK','TO','WF','WS','NU','MP','GU','PR','VI','UM','AS','CA','US','PS','RS','AQ','SX','CW','BQ','SS','AC','AN','BU','CP','CS','CT','DD','DG','DY','EA','FQ','FX','HV','IC','JT','MI','NH','NQ','NT','PC','PU','PZ','RH','SU','TA','TP','VD','WK','YD','YU','ZR');
END IF;
CREATE TABLE IF NOT EXISTS sessions
diff --git a/frontend/app/components/Session/LivePlayer.js b/frontend/app/components/Session/LivePlayer.js
index 967807556..ef4bda5ae 100644
--- a/frontend/app/components/Session/LivePlayer.js
+++ b/frontend/app/components/Session/LivePlayer.js
@@ -58,7 +58,7 @@ export default withRequest({
dataWrapper: data => data,
dataName: 'assistCredendials',
loadingName: 'loadingCredentials',
-})(withPermissions(['SESSION_REPLAY', 'ASSIST_LIVE'], '', true)(connect(
+})(withPermissions(['ASSIST_LIVE'], '', true)(connect(
state => {
const isAssist = state.getIn(['sessions', 'activeTab']).type === 'live';
const hasSessioPath = state.getIn([ 'sessions', 'sessionPath' ]).includes('/sessions');
diff --git a/frontend/app/components/shared/LiveSessionList/LiveSessionList.tsx b/frontend/app/components/shared/LiveSessionList/LiveSessionList.tsx
index d498c53d9..d6325ea00 100644
--- a/frontend/app/components/shared/LiveSessionList/LiveSessionList.tsx
+++ b/frontend/app/components/shared/LiveSessionList/LiveSessionList.tsx
@@ -8,7 +8,7 @@ import withPermissions from 'HOCs/withPermissions'
import { KEYS } from 'Types/filter/customFilter';
import { applyFilter, addAttribute } from 'Duck/filters';
import { FilterCategory, FilterKey } from 'App/types/filter/filterType';
-import { addFilterByKeyAndValue, updateCurrentPage, toggleSortOrder } from 'Duck/liveSearch';
+import { addFilterByKeyAndValue, updateCurrentPage, updateSort } from 'Duck/liveSearch';
import DropdownPlain from 'Shared/DropdownPlain';
import SortOrderButton from 'Shared/SortOrderButton';
import { TimezoneDropdown } from 'UI';
@@ -28,12 +28,12 @@ interface Props {
updateCurrentPage: (page: number) => void,
currentPage: number,
metaList: any,
- sortOrder: string,
- toggleSortOrder: (sortOrder: string) => void,
+ updateSort: (sort: any) => void,
+ sort: any,
}
function LiveSessionList(props: Props) {
- const { loading, filters, list, currentPage, metaList = [], sortOrder } = props;
+ const { loading, filters, list, currentPage, metaList = [], sort } = props;
var timeoutId;
const hasUserFilter = filters.map(i => i.key).includes(KEYS.USERID);
const [sessions, setSessions] = React.useState(list);
@@ -41,7 +41,6 @@ function LiveSessionList(props: Props) {
text: capitalize(i), value: i
})).toJS();
- const [sortBy, setSortBy] = React.useState('');
const displayedCount = Math.min(currentPage * PER_PAGE, sessions.size);
const addPage = () => props.updateCurrentPage(props.currentPage + 1)
@@ -53,9 +52,11 @@ function LiveSessionList(props: Props) {
}, []);
useEffect(() => {
- if (metaList.size === 0 || !!sortBy) return;
+ if (metaList.size === 0 || !!sort.field) return;
- setSortBy(sortOptions[0] && sortOptions[0].value)
+ if ( sortOptions[0]) {
+ props.updateSort({ field: sortOptions[0].value });
+ }
}, [metaList]);
useEffect(() => {
@@ -96,7 +97,7 @@ function LiveSessionList(props: Props) {
}
const onSortChange = (e, { value }) => {
- setSortBy(value);
+ props.updateSort({ field: value });
}
const timeout = () => {
@@ -106,6 +107,8 @@ function LiveSessionList(props: Props) {
}, AUTOREFRESH_INTERVAL);
}
+ console.log('srt', sort)
+
return (
@@ -125,10 +128,10 @@ function LiveSessionList(props: Props) {
-
+
props.updateSort({ order: state })} sortOrder={sort.order} />
- {sessions && sessions.sortBy(i => i.metadata[sortBy]).update(list => {
- return sortOrder === 'desc' ? list.reverse() : list;
+ {sessions && sessions.sortBy(i => i.metadata[sort.field]).update(list => {
+ return sort.order === 'desc' ? list.reverse() : list;
}).take(displayedCount).map(session => (
({
list: state.getIn(['sessions', 'liveSessions']),
loading: state.getIn([ 'sessions', 'loading' ]),
filters: state.getIn([ 'liveSearch', 'instance', 'filters' ]),
currentPage: state.getIn(["liveSearch", "currentPage"]),
metaList: state.getIn(['customFields', 'list']).map(i => i.key),
- sortOrder: state.getIn(['liveSearch', 'sortOrder']),
+ sort: state.getIn(['liveSearch', 'sort']),
}),
{
fetchLiveList,
@@ -183,6 +186,6 @@ export default withPermissions(['ASSIST_LIVE', 'SESSION_REPLAY'])(connect(
addAttribute,
addFilterByKeyAndValue,
updateCurrentPage,
- toggleSortOrder,
+ updateSort,
}
)(LiveSessionList));
diff --git a/frontend/app/components/shared/SessionItem/MetaMoreButton/MetaMoreButton.tsx b/frontend/app/components/shared/SessionItem/MetaMoreButton/MetaMoreButton.tsx
index 5cf1f95dd..e425cd9ae 100644
--- a/frontend/app/components/shared/SessionItem/MetaMoreButton/MetaMoreButton.tsx
+++ b/frontend/app/components/shared/SessionItem/MetaMoreButton/MetaMoreButton.tsx
@@ -17,16 +17,16 @@ export default function MetaMoreButton(props: Props) {
) }
+ className="p-0"
content={
-
+
{list.slice(maxLength).map(({ label, value }, index) => (
-
+
))}
}
on="click"
position="center center"
- hideOnScroll
/>
)
}
diff --git a/frontend/app/components/shared/SessionItem/SessionMetaList/SessionMetaList.tsx b/frontend/app/components/shared/SessionItem/SessionMetaList/SessionMetaList.tsx
index 96b082e96..d43f920c7 100644
--- a/frontend/app/components/shared/SessionItem/SessionMetaList/SessionMetaList.tsx
+++ b/frontend/app/components/shared/SessionItem/SessionMetaList/SessionMetaList.tsx
@@ -8,7 +8,7 @@ interface Props {
className?: string,
metaList: []
}
-const MAX_LENGTH = 3;
+const MAX_LENGTH = 4;
export default function SessionMetaList(props: Props) {
const { className = '', metaList } = props
return (
diff --git a/frontend/app/duck/liveSearch.js b/frontend/app/duck/liveSearch.js
index 5c9364e96..5a9ffd85b 100644
--- a/frontend/app/duck/liveSearch.js
+++ b/frontend/app/duck/liveSearch.js
@@ -15,14 +15,17 @@ const EDIT = editType(name);
const CLEAR_SEARCH = `${name}/CLEAR_SEARCH`;
const APPLY = `${name}/APPLY`;
const UPDATE_CURRENT_PAGE = `${name}/UPDATE_CURRENT_PAGE`;
-const TOGGLE_SORT_ORDER = `${name}/TOGGLE_SORT_ORDER`;
+const UPDATE_SORT = `${name}/UPDATE_SORT`;
const initialState = Map({
list: List(),
instance: new Filter({ filters: [] }),
filterSearchList: {},
currentPage: 1,
- sortOrder: 'asc',
+ sort: {
+ order: 'asc',
+ field: ''
+ }
});
function reducer(state = initialState, action = {}) {
@@ -31,8 +34,8 @@ function reducer(state = initialState, action = {}) {
return state.mergeIn(['instance'], action.instance);
case UPDATE_CURRENT_PAGE:
return state.set('currentPage', action.page);
- case TOGGLE_SORT_ORDER:
- return state.set('sortOrder', action.order);
+ case UPDATE_SORT:
+ return state.mergeIn(['sort'], action.sort);
}
return state;
}
@@ -103,9 +106,9 @@ export function updateCurrentPage(page) {
};
}
-export function toggleSortOrder (order) {
+export function updateSort(sort) {
return {
- type: TOGGLE_SORT_ORDER,
- order,
+ type: UPDATE_SORT,
+ sort,
};
}
\ No newline at end of file
diff --git a/frontend/app/types/filter/filter.js b/frontend/app/types/filter/filter.js
index 6d3b177f9..25d62c7cc 100644
--- a/frontend/app/types/filter/filter.js
+++ b/frontend/app/types/filter/filter.js
@@ -34,7 +34,7 @@ export default Record({
rangeValue,
startDate,
endDate,
- groupByUser: true,
+ groupByUser: false,
sort: 'startTs',
order: 'desc',
diff --git a/scripts/dockerfiles/nginx/Dockerfile b/scripts/dockerfiles/nginx/Dockerfile
index dd3414240..53da15731 100644
--- a/scripts/dockerfiles/nginx/Dockerfile
+++ b/scripts/dockerfiles/nginx/Dockerfile
@@ -1,9 +1,23 @@
+# Ability to add sticky sessions using any parameters
+FROM openresty/openresty:buster as builder
+workdir /work
+ADD https://github.com/openresty/lua-resty-balancer/archive/refs/heads/master.tar.gz .
+RUN apt update && \
+ apt install gcc make -y && \
+ tar -xf master.tar.gz && \
+ cd lua-resty-balancer-master && \
+ make
+
+
FROM openresty/openresty:buster
# Adding prometheus monitoring support
ADD https://raw.githubusercontent.com/knyar/nginx-lua-prometheus/master/prometheus.lua /usr/local/openresty/lualib/
ADD https://raw.githubusercontent.com/knyar/nginx-lua-prometheus/master/prometheus_keys.lua /usr/local/openresty/lualib/
ADD https://raw.githubusercontent.com/knyar/nginx-lua-prometheus/master/prometheus_resty_counter.lua /usr/local/openresty/lualib/
+COPY --from=builder /work/lua-resty-balancer-master/*.so /usr/local/openresty/lualib/lua-resty-chash/
+COPY --from=builder /work/lua-resty-balancer-master/lib /usr/local/openresty/lualib/lua-resty-chash/lib/
+
RUN chmod 0644 /usr/local/openresty/lualib/*.lua
# Enabling monitoring on port 9145
diff --git a/scripts/helm/db/init_dbs/postgresql/1.5.1/1.5.1.sql b/scripts/helm/db/init_dbs/postgresql/1.5.1/1.5.1.sql
index babe0c705..b7e5f1fa6 100644
--- a/scripts/helm/db/init_dbs/postgresql/1.5.1/1.5.1.sql
+++ b/scripts/helm/db/init_dbs/postgresql/1.5.1/1.5.1.sql
@@ -5,4 +5,36 @@ $$
SELECT 'v1.5.1'
$$ LANGUAGE sql IMMUTABLE;
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'AC';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'AN';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'BU';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'CP';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'CS';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'CT';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'DD';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'DG';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'DY';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'EA';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'FQ';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'FX';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'HV';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'IC';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'JT';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'MI';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'NH';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'NQ';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'NT';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'PC';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'PU';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'PZ';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'RH';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'SU';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'TA';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'TP';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'VD';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'WK';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'YD';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'YU';
+ALTER TYPE country ADD VALUE IF NOT EXISTS 'ZR';
+
COMMIT;
\ No newline at end of file
diff --git a/scripts/helm/db/init_dbs/postgresql/init_schema.sql b/scripts/helm/db/init_dbs/postgresql/init_schema.sql
index abf4df15a..3d05795e9 100644
--- a/scripts/helm/db/init_dbs/postgresql/init_schema.sql
+++ b/scripts/helm/db/init_dbs/postgresql/init_schema.sql
@@ -6,7 +6,7 @@ CREATE SCHEMA IF NOT EXISTS events;
CREATE OR REPLACE FUNCTION openreplay_version()
RETURNS text AS
$$
-SELECT 'v1.5.0'
+SELECT 'v1.5.1'
$$ LANGUAGE sql IMMUTABLE;
-- --- accounts.sql ---
@@ -464,7 +464,7 @@ $$
-- --- sessions.sql ---
CREATE TYPE device_type AS ENUM ('desktop', 'tablet', 'mobile', 'other');
- CREATE TYPE country AS ENUM ('UN', 'RW', 'SO', 'YE', 'IQ', 'SA', 'IR', 'CY', 'TZ', 'SY', 'AM', 'KE', 'CD', 'DJ', 'UG', 'CF', 'SC', 'JO', 'LB', 'KW', 'OM', 'QA', 'BH', 'AE', 'IL', 'TR', 'ET', 'ER', 'EG', 'SD', 'GR', 'BI', 'EE', 'LV', 'AZ', 'LT', 'SJ', 'GE', 'MD', 'BY', 'FI', 'AX', 'UA', 'MK', 'HU', 'BG', 'AL', 'PL', 'RO', 'XK', 'ZW', 'ZM', 'KM', 'MW', 'LS', 'BW', 'MU', 'SZ', 'RE', 'ZA', 'YT', 'MZ', 'MG', 'AF', 'PK', 'BD', 'TM', 'TJ', 'LK', 'BT', 'IN', 'MV', 'IO', 'NP', 'MM', 'UZ', 'KZ', 'KG', 'TF', 'HM', 'CC', 'PW', 'VN', 'TH', 'ID', 'LA', 'TW', 'PH', 'MY', 'CN', 'HK', 'BN', 'MO', 'KH', 'KR', 'JP', 'KP', 'SG', 'CK', 'TL', 'RU', 'MN', 'AU', 'CX', 'MH', 'FM', 'PG', 'SB', 'TV', 'NR', 'VU', 'NC', 'NF', 'NZ', 'FJ', 'LY', 'CM', 'SN', 'CG', 'PT', 'LR', 'CI', 'GH', 'GQ', 'NG', 'BF', 'TG', 'GW', 'MR', 'BJ', 'GA', 'SL', 'ST', 'GI', 'GM', 'GN', 'TD', 'NE', 'ML', 'EH', 'TN', 'ES', 'MA', 'MT', 'DZ', 'FO', 'DK', 'IS', 'GB', 'CH', 'SE', 'NL', 'AT', 'BE', 'DE', 'LU', 'IE', 'MC', 'FR', 'AD', 'LI', 'JE', 'IM', 'GG', 'SK', 'CZ', 'NO', 'VA', 'SM', 'IT', 'SI', 'ME', 'HR', 'BA', 'AO', 'NA', 'SH', 'BV', 'BB', 'CV', 'GY', 'GF', 'SR', 'PM', 'GL', 'PY', 'UY', 'BR', 'FK', 'GS', 'JM', 'DO', 'CU', 'MQ', 'BS', 'BM', 'AI', 'TT', 'KN', 'DM', 'AG', 'LC', 'TC', 'AW', 'VG', 'VC', 'MS', 'MF', 'BL', 'GP', 'GD', 'KY', 'BZ', 'SV', 'GT', 'HN', 'NI', 'CR', 'VE', 'EC', 'CO', 'PA', 'HT', 'AR', 'CL', 'BO', 'PE', 'MX', 'PF', 'PN', 'KI', 'TK', 'TO', 'WF', 'WS', 'NU', 'MP', 'GU', 'PR', 'VI', 'UM', 'AS', 'CA', 'US', 'PS', 'RS', 'AQ', 'SX', 'CW', 'BQ', 'SS');
+ CREATE TYPE country AS ENUM ('UN', 'RW', 'SO', 'YE', 'IQ', 'SA', 'IR', 'CY', 'TZ', 'SY', 'AM', 'KE', 'CD', 'DJ', 'UG', 'CF', 'SC', 'JO', 'LB', 'KW', 'OM', 'QA', 'BH', 'AE', 'IL', 'TR', 'ET', 'ER', 'EG', 'SD', 'GR', 'BI', 'EE', 'LV', 'AZ', 'LT', 'SJ', 'GE', 'MD', 'BY', 'FI', 'AX', 'UA', 'MK', 'HU', 'BG', 'AL', 'PL', 'RO', 'XK', 'ZW', 'ZM', 'KM', 'MW', 'LS', 'BW', 'MU', 'SZ', 'RE', 'ZA', 'YT', 'MZ', 'MG', 'AF', 'PK', 'BD', 'TM', 'TJ', 'LK', 'BT', 'IN', 'MV', 'IO', 'NP', 'MM', 'UZ', 'KZ', 'KG', 'TF', 'HM', 'CC', 'PW', 'VN', 'TH', 'ID', 'LA', 'TW', 'PH', 'MY', 'CN', 'HK', 'BN', 'MO', 'KH', 'KR', 'JP', 'KP', 'SG', 'CK', 'TL', 'RU', 'MN', 'AU', 'CX', 'MH', 'FM', 'PG', 'SB', 'TV', 'NR', 'VU', 'NC', 'NF', 'NZ', 'FJ', 'LY', 'CM', 'SN', 'CG', 'PT', 'LR', 'CI', 'GH', 'GQ', 'NG', 'BF', 'TG', 'GW', 'MR', 'BJ', 'GA', 'SL', 'ST', 'GI', 'GM', 'GN', 'TD', 'NE', 'ML', 'EH', 'TN', 'ES', 'MA', 'MT', 'DZ', 'FO', 'DK', 'IS', 'GB', 'CH', 'SE', 'NL', 'AT', 'BE', 'DE', 'LU', 'IE', 'MC', 'FR', 'AD', 'LI', 'JE', 'IM', 'GG', 'SK', 'CZ', 'NO', 'VA', 'SM', 'IT', 'SI', 'ME', 'HR', 'BA', 'AO', 'NA', 'SH', 'BV', 'BB', 'CV', 'GY', 'GF', 'SR', 'PM', 'GL', 'PY', 'UY', 'BR', 'FK', 'GS', 'JM', 'DO', 'CU', 'MQ', 'BS', 'BM', 'AI', 'TT', 'KN', 'DM', 'AG', 'LC', 'TC', 'AW', 'VG', 'VC', 'MS', 'MF', 'BL', 'GP', 'GD', 'KY', 'BZ', 'SV', 'GT', 'HN', 'NI', 'CR', 'VE', 'EC', 'CO', 'PA', 'HT', 'AR', 'CL', 'BO', 'PE', 'MX', 'PF', 'PN', 'KI', 'TK', 'TO', 'WF', 'WS', 'NU', 'MP', 'GU', 'PR', 'VI', 'UM', 'AS', 'CA', 'US', 'PS', 'RS', 'AQ', 'SX', 'CW', 'BQ', 'SS','AC','AN','BU','CP','CS','CT','DD','DG','DY','EA','FQ','FX','HV','IC','JT','MI','NH','NQ','NT','PC','PU','PZ','RH','SU','TA','TP','VD','WK','YD','YU','ZR');
CREATE TYPE platform AS ENUM ('web','ios','android');
CREATE TABLE sessions