Remove hasura and hasura-auth (#134)

* Remove hasura and hasura-auth

* Move all models to prisma

* Start implementing graphql

* chore: clean package json

* chore: make the code build

* chore: get initial graphql.tsx file

* feature: use typegql as qgl server

* refactor: small refactoring

* refactor: clean tests

* bugfix: make all filters not case sensitive

* chore: remove unused imports

---------

Co-authored-by: Sammy Teillet <sammy.teillet@gmail.com>
This commit is contained in:
Charles Bochet
2023-05-24 17:20:15 +02:00
committed by GitHub
parent 7192457d0a
commit 5d06398d2e
177 changed files with 12215 additions and 7040 deletions

16
.vscode/up.sh vendored
View File

@@ -15,20 +15,4 @@ done
echo "Postgres is accepting connections!" echo "Postgres is accepting connections!"
docker-compose up -d twenty-hasura
while ! curl -s http://localhost:8080/healthz > /dev/null ; do
sleep 1
echo "Waiting for Hasura to be ready..."
done
docker-compose up -d hasura-auth
while ! curl -s http://localhost:4000/healthz > /dev/null ; do
sleep 1
echo "Waiting for Hasura Auth to be ready..."
done
docker-compose exec twenty-hasura hasura deploy
docker-compose up -d docker-compose up -d

View File

@@ -12,7 +12,6 @@ Welcome to Twenty documentation!
Twenty development stack is composed of 3 different layers Twenty development stack is composed of 3 different layers
- front: our frontend React app - front: our frontend React app
- hasura: our graphql engine exposing our database and server
- server: our backend that contain endpoint, crm logic, scripts, jobs... - server: our backend that contain endpoint, crm logic, scripts, jobs...
- storages: postgres - storages: postgres
@@ -46,7 +45,6 @@ make up
Once this is completed you should have: Once this is completed you should have:
- front available on: http://localhost:3001 - front available on: http://localhost:3001
- hasura available on: http://localhost:8080
- server available on: http://localhost:3000/health - server available on: http://localhost:3000/health
- postgres: available on http://localhost:5432 that should contain `twenty` database - postgres: available on http://localhost:5432 that should contain `twenty` database
@@ -65,9 +63,3 @@ If you are using Docker install, make sure to ssh in the docker container during
Run tests: `make front-test` Run tests: `make front-test`
Run coverage: `make front-coverage` Run coverage: `make front-coverage`
Run storybook: `make front-storybook` Run storybook: `make front-storybook`
### Hasura development
Open hasura console: `make hasura-console`
Do your changes in hasura console on http://localhost:9695
Commit your changes in git

View File

@@ -1,7 +1,7 @@
module.exports = { module.exports = {
schema: [ schema: [
{ {
[process.env.HASURA_GRAPHQL_ENDPOINT]: { 'http://localhost:3000/graphql': {
headers: { headers: {
'x-hasura-admin-secret': process.env.HASURA_GRAPHQL_ADMIN_SECRET, 'x-hasura-admin-secret': process.env.HASURA_GRAPHQL_ADMIN_SECRET,
}, },

View File

@@ -32,7 +32,7 @@
"build-storybook": "storybook build -s public", "build-storybook": "storybook build -s public",
"coverage": "react-scripts test --coverage --watchAll", "coverage": "react-scripts test --coverage --watchAll",
"coverage-ci": "react-scripts test --coverage --watchAll=false", "coverage-ci": "react-scripts test --coverage --watchAll=false",
"graphql-generate": "REACT_APP_GRAPHQL_ADMIN_SECRET=$REACT_APP_GRAPHQL_ADMIN_SECRET graphql-codegen --config codegen.js" "graphql-codegen": "REACT_APP_GRAPHQL_ADMIN_SECRET=$REACT_APP_GRAPHQL_ADMIN_SECRET graphql-codegen --config codegen.js"
}, },
"eslintConfig": { "eslintConfig": {
"extends": [ "extends": [

View File

@@ -49,7 +49,7 @@ const mocks = [
{ {
request: { request: {
query: GET_PEOPLE, query: GET_PEOPLE,
variables: { orderBy: [{ created_at: 'desc' }], where: {} }, variables: { orderBy: [{ createdAt: 'desc' }], where: {} },
}, },
result: { result: {
data: { data: {

View File

@@ -11,7 +11,7 @@ import { onError } from '@apollo/client/link/error';
import { refreshAccessToken } from './services/auth/AuthService'; import { refreshAccessToken } from './services/auth/AuthService';
const apiLink = createHttpLink({ const apiLink = createHttpLink({
uri: `${process.env.REACT_APP_API_URL}/v1/graphql`, uri: `${process.env.REACT_APP_API_URL}`,
}); });
const withAuthHeadersLink = setContext((_, { headers }) => { const withAuthHeadersLink = setContext((_, { headers }) => {

View File

@@ -11,6 +11,7 @@ import { MockedProvider } from '@apollo/client/testing';
import { SEARCH_COMPANY_QUERY } from '../../../services/api/search/search'; import { SEARCH_COMPANY_QUERY } from '../../../services/api/search/search';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { SearchConfigType } from '../../../interfaces/search/interface'; import { SearchConfigType } from '../../../interfaces/search/interface';
import { QueryMode } from '../../../generated/graphql';
const component = { const component = {
title: 'editable-cell/EditableRelation', title: 'editable-cell/EditableRelation',
@@ -41,7 +42,7 @@ const mocks = [
request: { request: {
query: SEARCH_COMPANY_QUERY, query: SEARCH_COMPANY_QUERY,
variables: { variables: {
where: { name: { _ilike: '%%' } }, where: { name: { contains: '%%', mode: QueryMode.Insensitive } },
limit: 5, limit: 5,
}, },
}, },
@@ -92,7 +93,7 @@ EditableRelationStory.args = {
searchConfig: { searchConfig: {
query: SEARCH_COMPANY_QUERY, query: SEARCH_COMPANY_QUERY,
template: (searchInput: string) => ({ template: (searchInput: string) => ({
name: { _ilike: `%${searchInput}%` }, name: { contains: `%${searchInput}%`, mode: QueryMode.Insensitive },
}), }),
resultMapper: (company) => ({ resultMapper: (company) => ({
render: (company) => company.name, render: (company) => company.name,

View File

@@ -12,6 +12,7 @@ import {
SelectedFilterType, SelectedFilterType,
} from '../../../../interfaces/filters/interface'; } from '../../../../interfaces/filters/interface';
import { mockCompaniesData } from '../../../../pages/companies/__tests__/__data__/mock-data'; import { mockCompaniesData } from '../../../../pages/companies/__tests__/__data__/mock-data';
import { QueryMode } from '../../../../generated/graphql';
const component = { const component = {
title: 'FilterDropdownButton', title: 'FilterDropdownButton',
@@ -28,7 +29,10 @@ const mocks = [
{ {
request: { request: {
query: SEARCH_COMPANY_QUERY, query: SEARCH_COMPANY_QUERY,
variables: { where: { name: { _ilike: '%%' } }, limit: 5 }, variables: {
where: { name: { contains: '%%', mode: QueryMode.Insensitive } },
limit: 5,
},
}, },
result: { result: {
data: { data: {
@@ -39,7 +43,10 @@ const mocks = [
{ {
request: { request: {
query: SEARCH_COMPANY_QUERY, query: SEARCH_COMPANY_QUERY,
variables: { where: { name: { _ilike: '%Airc%' } }, limit: 5 }, variables: {
where: { name: { contains: '%Airc%', mode: QueryMode.Insensitive } },
limit: 5,
},
}, },
result: { result: {
data: { data: {

View File

@@ -27,7 +27,7 @@ export const RegularSortAndFilterBar = ({
label: 'Is', label: 'Is',
id: 'is', id: 'is',
whereTemplate: (person: Person) => { whereTemplate: (person: Person) => {
return { email: { _eq: person.email } }; return { email: { equals: person.email } };
}, },
}, },
key: 'test_filter', key: 'test_filter',

View File

@@ -2,7 +2,10 @@ import { ThemeProvider } from '@emotion/react';
import { lightTheme } from '../../../../layout/styles/themes'; import { lightTheme } from '../../../../layout/styles/themes';
import { SortDropdownButton } from '../SortDropdownButton'; import { SortDropdownButton } from '../SortDropdownButton';
import styled from '@emotion/styled'; import styled from '@emotion/styled';
import { Order_By, People_Order_By } from '../../../../generated/graphql'; import {
SortOrder as Order_By,
PersonOrderByWithRelationInput as People_Order_By,
} from '../../../../generated/graphql';
import { SortType } from '../../../../interfaces/sorts/interface'; import { SortType } from '../../../../interfaces/sorts/interface';
import { import {
TbBuilding, TbBuilding,
@@ -52,7 +55,7 @@ const availableSorts = [
_type: 'default_sort', _type: 'default_sort',
}, },
{ {
key: 'created_at', key: 'createdAt',
label: 'Created at', label: 'Created at',
icon: <TbCalendar size={16} />, icon: <TbCalendar size={16} />,
_type: 'default_sort', _type: 'default_sort',

View File

@@ -1,4 +1,4 @@
import { Order_By } from '../../../generated/graphql'; import { SortOrder as Order_By } from '../../../generated/graphql';
import { BoolExpType } from '../../../interfaces/entities/generic.interface'; import { BoolExpType } from '../../../interfaces/entities/generic.interface';
import { import {
FilterableFieldsType, FilterableFieldsType,

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,7 @@
import { import {
Companies_Bool_Exp, CompanyWhereInput as Companies_Bool_Exp,
People_Bool_Exp, PersonWhereInput as People_Bool_Exp,
Users_Bool_Exp, UserWhereInput as Users_Bool_Exp,
} from '../../generated/graphql'; } from '../../generated/graphql';
import { Company, GraphqlQueryCompany } from './company.interface'; import { Company, GraphqlQueryCompany } from './company.interface';
import { GraphqlQueryPerson, Person } from './person.interface'; import { GraphqlQueryPerson, Person } from './person.interface';

View File

@@ -1,5 +1,5 @@
import { ReactNode } from 'react'; import { ReactNode } from 'react';
import { Order_By } from '../../generated/graphql'; import { SortOrder as Order_By } from '../../generated/graphql';
export type SortType<OrderByTemplate> = export type SortType<OrderByTemplate> =
| { | {

View File

@@ -20,7 +20,7 @@ import {
reduceFiltersToWhere, reduceFiltersToWhere,
reduceSortsToOrderBy, reduceSortsToOrderBy,
} from '../../components/table/table-header/helpers'; } from '../../components/table/table-header/helpers';
import { Companies_Order_By } from '../../generated/graphql'; import { CompanyOrderByWithRelationInput as Companies_Order_By } from '../../generated/graphql';
import ActionBar from '../../components/table/action-bar/ActionBar'; import ActionBar from '../../components/table/action-bar/ActionBar';
import { SelectedFilterType } from '../../interfaces/filters/interface'; import { SelectedFilterType } from '../../interfaces/filters/interface';
import { BoolExpType } from '../../interfaces/entities/generic.interface'; import { BoolExpType } from '../../interfaces/entities/generic.interface';

View File

@@ -5,6 +5,7 @@ import { lightTheme } from '../../../layout/styles/themes';
import { GET_COMPANIES } from '../../../services/api/companies'; import { GET_COMPANIES } from '../../../services/api/companies';
import { mockCompaniesData } from '../__tests__/__data__/mock-data'; import { mockCompaniesData } from '../__tests__/__data__/mock-data';
import { MockedProvider } from '@apollo/client/testing'; import { MockedProvider } from '@apollo/client/testing';
import { QueryMode } from '../../../generated/graphql';
const component = { const component = {
title: 'Companies', title: 'Companies',
@@ -18,7 +19,7 @@ const mocks = [
request: { request: {
query: GET_COMPANIES, query: GET_COMPANIES,
variables: { variables: {
orderBy: [{ created_at: 'desc' }], orderBy: [{ createdAt: 'desc' }],
where: {}, where: {},
}, },
}, },
@@ -32,7 +33,7 @@ const mocks = [
request: { request: {
query: GET_COMPANIES, query: GET_COMPANIES,
variables: { variables: {
orderBy: [{ created_at: 'desc' }], orderBy: [{ createdAt: 'desc' }],
where: {}, where: {},
}, },
}, },
@@ -46,8 +47,10 @@ const mocks = [
request: { request: {
query: GET_COMPANIES, query: GET_COMPANIES,
variables: { variables: {
orderBy: [{ created_at: 'desc' }], orderBy: [{ createdAt: 'desc' }],
where: { domain_name: { _ilike: '%aircal%' } }, where: {
domainName: { contains: '%aircal%', mode: QueryMode.Insensitive },
},
}, },
}, },
result: { result: {

View File

@@ -3,7 +3,7 @@
exports[`Companies Filter should render the filter company_employees 1`] = ` exports[`Companies Filter should render the filter company_employees 1`] = `
Object { Object {
"employees": Object { "employees": Object {
"_gte": 2, "gte": 2,
}, },
} }
`; `;
@@ -11,7 +11,8 @@ Object {
exports[`Companies Filter should render the filter company_name 1`] = ` exports[`Companies Filter should render the filter company_name 1`] = `
Object { Object {
"name": Object { "name": Object {
"_ilike": "%name%", "contains": "%name%",
"mode": "insensitive",
}, },
} }
`; `;

View File

@@ -27,6 +27,7 @@ import {
TbSum, TbSum,
TbUser, TbUser,
} from 'react-icons/tb'; } from 'react-icons/tb';
import { QueryMode } from '../../generated/graphql';
const columnHelper = createColumnHelper<Company>(); const columnHelper = createColumnHelper<Company>();
@@ -178,7 +179,10 @@ export const useCompaniesColumns = () => {
{ {
query: SEARCH_USER_QUERY, query: SEARCH_USER_QUERY,
template: (searchInput: string) => ({ template: (searchInput: string) => ({
displayName: { _ilike: `%${searchInput}%` }, displayName: {
contains: `%${searchInput}%`,
mode: QueryMode.Insensitive,
},
}), }),
resultMapper: (accountOwner) => ({ resultMapper: (accountOwner) => ({
render: (accountOwner) => accountOwner.displayName, render: (accountOwner) => accountOwner.displayName,

View File

@@ -10,6 +10,7 @@ import { Company } from '../../interfaces/entities/company.interface';
import { FilterConfigType } from '../../interfaces/filters/interface'; import { FilterConfigType } from '../../interfaces/filters/interface';
import { SEARCH_USER_QUERY } from '../../services/api/search/search'; import { SEARCH_USER_QUERY } from '../../services/api/search/search';
import { User, mapToUser } from '../../interfaces/entities/user.interface'; import { User, mapToUser } from '../../interfaces/entities/user.interface';
import { QueryMode } from '../../generated/graphql';
export const nameFilter = { export const nameFilter = {
key: 'company_name', key: 'company_name',
@@ -21,14 +22,21 @@ export const nameFilter = {
label: 'Contains', label: 'Contains',
id: 'like', id: 'like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
name: { _ilike: `%${searchString}%` }, name: { contains: `%${searchString}%`, mode: QueryMode.Insensitive },
}), }),
}, },
{ {
label: 'Does not contain', label: 'Does not contain',
id: 'not_like', id: 'not_like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
_not: { name: { _ilike: `%${searchString}%` } }, NOT: [
{
name: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
],
}), }),
}, },
], ],
@@ -45,7 +53,7 @@ export const employeesFilter = {
id: 'greater_than', id: 'greater_than',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
employees: { employees: {
_gte: isNaN(Number(searchString)) ? undefined : Number(searchString), gte: isNaN(Number(searchString)) ? undefined : Number(searchString),
}, },
}), }),
}, },
@@ -54,7 +62,7 @@ export const employeesFilter = {
id: 'less_than', id: 'less_than',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
employees: { employees: {
_lte: isNaN(Number(searchString)) ? undefined : Number(searchString), lte: isNaN(Number(searchString)) ? undefined : Number(searchString),
}, },
}), }),
}, },
@@ -71,14 +79,24 @@ export const urlFilter = {
label: 'Contains', label: 'Contains',
id: 'like', id: 'like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
domain_name: { _ilike: `%${searchString}%` }, domainName: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
}), }),
}, },
{ {
label: 'Does not contain', label: 'Does not contain',
id: 'not_like', id: 'not_like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
_not: { domain_name: { _ilike: `%${searchString}%` } }, NOT: [
{
domainName: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
],
}), }),
}, },
], ],
@@ -94,14 +112,21 @@ export const addressFilter = {
label: 'Contains', label: 'Contains',
id: 'like', id: 'like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
address: { _ilike: `%${searchString}%` }, address: { contains: `%${searchString}%`, mode: QueryMode.Insensitive },
}), }),
}, },
{ {
label: 'Does not contain', label: 'Does not contain',
id: 'not_like', id: 'not_like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
_not: { address: { _ilike: `%${searchString}%` } }, NOT: [
{
address: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
],
}), }),
}, },
], ],
@@ -117,8 +142,8 @@ export const creationDateFilter = {
label: 'Greater than', label: 'Greater than',
id: 'greater_than', id: 'greater_than',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
created_at: { createdAt: {
_gte: searchString, gte: searchString,
}, },
}), }),
}, },
@@ -126,8 +151,8 @@ export const creationDateFilter = {
label: 'Less than', label: 'Less than',
id: 'less_than', id: 'less_than',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
created_at: { createdAt: {
_lte: searchString, lte: searchString,
}, },
}), }),
}, },
@@ -142,7 +167,10 @@ export const accountOwnerFilter = {
searchConfig: { searchConfig: {
query: SEARCH_USER_QUERY, query: SEARCH_USER_QUERY,
template: (searchString: string) => ({ template: (searchString: string) => ({
displayName: { _ilike: `%${searchString}%` }, displayName: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
}), }),
resultMapper: (data) => ({ resultMapper: (data) => ({
value: mapToUser(data), value: mapToUser(data),
@@ -155,14 +183,20 @@ export const accountOwnerFilter = {
label: 'Is', label: 'Is',
id: 'is', id: 'is',
whereTemplate: (owner) => ({ whereTemplate: (owner) => ({
account_owner: { displayName: { _eq: owner.displayName } }, accountOwner: { is: { displayName: { equals: owner.displayName } } },
}), }),
}, },
{ {
label: 'Is not', label: 'Is not',
id: 'is_not', id: 'is_not',
whereTemplate: (owner) => ({ whereTemplate: (owner) => ({
_not: { account_owner: { displayName: { _eq: owner.displayName } } }, NOT: [
{
accountOwner: {
is: { displayName: { equals: owner.displayName } },
},
},
],
}), }),
}, },
], ],

View File

@@ -5,7 +5,7 @@ import {
TbMapPin, TbMapPin,
TbSum, TbSum,
} from 'react-icons/tb'; } from 'react-icons/tb';
import { Companies_Order_By } from '../../generated/graphql'; import { CompanyOrderByWithRelationInput as Companies_Order_By } from '../../generated/graphql';
import { SortType } from '../../interfaces/sorts/interface'; import { SortType } from '../../interfaces/sorts/interface';
export const availableSorts = [ export const availableSorts = [
@@ -22,7 +22,7 @@ export const availableSorts = [
_type: 'default_sort', _type: 'default_sort',
}, },
{ {
key: 'domain_name', key: 'domainName',
label: 'Url', label: 'Url',
icon: <TbLink size={16} />, icon: <TbLink size={16} />,
_type: 'default_sort', _type: 'default_sort',
@@ -34,7 +34,7 @@ export const availableSorts = [
_type: 'default_sort', _type: 'default_sort',
}, },
{ {
key: 'created_at', key: 'createdAt',
label: 'Creation', label: 'Creation',
icon: <TbCalendar size={16} />, icon: <TbCalendar size={16} />,
_type: 'default_sort', _type: 'default_sort',

View File

@@ -19,7 +19,7 @@ const mocks = [
request: { request: {
query: GET_PEOPLE, query: GET_PEOPLE,
variables: { variables: {
orderBy: [{ created_at: 'desc' }], orderBy: [{ createdAt: 'desc' }],
where: {}, where: {},
}, },
}, },
@@ -33,7 +33,7 @@ const mocks = [
request: { request: {
query: GET_PEOPLE, query: GET_PEOPLE,
variables: { variables: {
orderBy: [{ created_at: 'desc' }], orderBy: [{ createdAt: 'desc' }],
where: {}, where: {},
}, },
}, },

View File

@@ -3,7 +3,8 @@
exports[`PeopleFilter should render the filter city which is text search 1`] = ` exports[`PeopleFilter should render the filter city which is text search 1`] = `
Object { Object {
"city": Object { "city": Object {
"_ilike": "%Paris%", "contains": "%Paris%",
"mode": "insensitive",
}, },
} }
`; `;
@@ -11,8 +12,10 @@ Object {
exports[`PeopleFilter should render the filter company_name which relation search 1`] = ` exports[`PeopleFilter should render the filter company_name which relation search 1`] = `
Object { Object {
"company": Object { "company": Object {
"name": Object { "is": Object {
"_eq": "test-name", "name": Object {
"equals": "test-name",
},
}, },
}, },
} }

View File

@@ -30,6 +30,7 @@ import {
TbPhone, TbPhone,
TbUser, TbUser,
} from 'react-icons/tb'; } from 'react-icons/tb';
import { QueryMode } from '../../generated/graphql';
const columnHelper = createColumnHelper<Person>(); const columnHelper = createColumnHelper<Person>();
@@ -118,7 +119,10 @@ export const usePeopleColumns = () => {
{ {
query: SEARCH_COMPANY_QUERY, query: SEARCH_COMPANY_QUERY,
template: (searchInput: string) => ({ template: (searchInput: string) => ({
name: { _ilike: `%${searchInput}%` }, name: {
contains: `%${searchInput}%`,
mode: QueryMode.Insensitive,
},
}), }),
resultMapper: (company) => ({ resultMapper: (company) => ({
render: (company) => company.name, render: (company) => company.name,

View File

@@ -13,6 +13,7 @@ import {
TbPhone, TbPhone,
TbUser, TbUser,
} from 'react-icons/tb'; } from 'react-icons/tb';
import { QueryMode } from '../../generated/graphql';
export const fullnameFilter = { export const fullnameFilter = {
key: 'fullname', key: 'fullname',
@@ -24,9 +25,19 @@ export const fullnameFilter = {
label: 'Contains', label: 'Contains',
id: 'like', id: 'like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
_or: [ OR: [
{ firstname: { _ilike: `%${searchString}%` } }, {
{ lastname: { _ilike: `%${searchString}%` } }, firstname: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
{
lastname: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
], ],
}), }),
}, },
@@ -34,12 +45,24 @@ export const fullnameFilter = {
label: 'Does not contain', label: 'Does not contain',
id: 'not_like', id: 'not_like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
_not: { NOT: [
_and: [ {
{ firstname: { _ilike: `%${searchString}%` } }, AND: [
{ lastname: { _ilike: `%${searchString}%` } }, {
], firstname: {
}, contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
{
lastname: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
],
},
],
}), }),
}, },
], ],
@@ -55,14 +78,21 @@ export const emailFilter = {
label: 'Contains', label: 'Contains',
id: 'like', id: 'like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
email: { _ilike: `%${searchString}%` }, email: { contains: `%${searchString}%`, mode: QueryMode.Insensitive },
}), }),
}, },
{ {
label: 'Does not contain', label: 'Does not contain',
id: 'not_like', id: 'not_like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
_not: { email: { _ilike: `%${searchString}%` } }, NOT: [
{
email: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
],
}), }),
}, },
], ],
@@ -76,7 +106,7 @@ export const companyFilter = {
searchConfig: { searchConfig: {
query: SEARCH_COMPANY_QUERY, query: SEARCH_COMPANY_QUERY,
template: (searchString: string) => ({ template: (searchString: string) => ({
name: { _ilike: `%${searchString}%` }, name: { contains: `%${searchString}%`, mode: QueryMode.Insensitive },
}), }),
resultMapper: (data) => ({ resultMapper: (data) => ({
value: mapToCompany(data), value: mapToCompany(data),
@@ -89,14 +119,14 @@ export const companyFilter = {
label: 'Is', label: 'Is',
id: 'is', id: 'is',
whereTemplate: (company) => ({ whereTemplate: (company) => ({
company: { name: { _eq: company.name } }, company: { is: { name: { equals: company.name } } },
}), }),
}, },
{ {
label: 'Is not', label: 'Is not',
id: 'is_not', id: 'is_not',
whereTemplate: (company) => ({ whereTemplate: (company) => ({
_not: { company: { name: { _eq: company.name } } }, NOT: [{ company: { is: { name: { equals: company.name } } } }],
}), }),
}, },
], ],
@@ -112,14 +142,21 @@ export const phoneFilter = {
label: 'Contains', label: 'Contains',
id: 'like', id: 'like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
phone: { _ilike: `%${searchString}%` }, phone: { contains: `%${searchString}%`, mode: QueryMode.Insensitive },
}), }),
}, },
{ {
label: 'Does not contain', label: 'Does not contain',
id: 'not_like', id: 'not_like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
_not: { phone: { _ilike: `%${searchString}%` } }, NOT: [
{
phone: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
],
}), }),
}, },
], ],
@@ -135,8 +172,8 @@ export const creationDateFilter = {
label: 'Greater than', label: 'Greater than',
id: 'greater_than', id: 'greater_than',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
created_at: { createdAt: {
_gte: searchString, gte: searchString,
}, },
}), }),
}, },
@@ -144,8 +181,8 @@ export const creationDateFilter = {
label: 'Less than', label: 'Less than',
id: 'less_than', id: 'less_than',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
created_at: { createdAt: {
_lte: searchString, lte: searchString,
}, },
}), }),
}, },
@@ -162,14 +199,21 @@ export const cityFilter = {
label: 'Contains', label: 'Contains',
id: 'like', id: 'like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
city: { _ilike: `%${searchString}%` }, city: { contains: `%${searchString}%`, mode: QueryMode.Insensitive },
}), }),
}, },
{ {
label: 'Does not contain', label: 'Does not contain',
id: 'not_like', id: 'not_like',
whereTemplate: (searchString) => ({ whereTemplate: (searchString) => ({
_not: { city: { _ilike: `%${searchString}%` } }, NOT: [
{
city: {
contains: `%${searchString}%`,
mode: QueryMode.Insensitive,
},
},
],
}), }),
}, },
], ],

View File

@@ -1,4 +1,7 @@
import { Order_By, People_Order_By } from '../../generated/graphql'; import {
SortOrder as Order_By,
PersonOrderByWithRelationInput as People_Order_By,
} from '../../generated/graphql';
import { SortType } from '../../interfaces/sorts/interface'; import { SortType } from '../../interfaces/sorts/interface';
import { import {
TbBuilding, TbBuilding,
@@ -40,7 +43,7 @@ export const availableSorts = [
_type: 'default_sort', _type: 'default_sort',
}, },
{ {
key: 'created_at', key: 'createdAt',
label: 'Created at', label: 'Created at',
icon: <TbCalendar size={16} />, icon: <TbCalendar size={16} />,
_type: 'default_sort', _type: 'default_sort',

View File

@@ -1,8 +1,8 @@
import { QueryResult, gql, useQuery } from '@apollo/client'; import { QueryResult, gql, useQuery } from '@apollo/client';
import { import {
Order_By, SortOrder as Order_By,
Companies_Order_By, CompanyOrderByWithRelationInput as Companies_Order_By,
Companies_Bool_Exp, CompanyWhereInput as Companies_Bool_Exp,
} from '../../../generated/graphql'; } from '../../../generated/graphql';
import { GraphqlQueryCompany } from '../../../interfaces/entities/company.interface'; import { GraphqlQueryCompany } from '../../../interfaces/entities/company.interface';
import { SelectedSortType } from '../../../interfaces/sorts/interface'; import { SelectedSortType } from '../../../interfaces/sorts/interface';
@@ -11,17 +11,17 @@ export type CompaniesSelectedSortType = SelectedSortType<Companies_Order_By>;
export const GET_COMPANIES = gql` export const GET_COMPANIES = gql`
query GetCompanies( query GetCompanies(
$orderBy: [companies_order_by!] $orderBy: [CompanyOrderByWithRelationInput!]
$where: companies_bool_exp $where: CompanyWhereInput
) { ) {
companies(order_by: $orderBy, where: $where) { companies(orderBy: $orderBy, where: $where) {
id id
domain_name domain_name: domainName
name name
created_at created_at: createdAt
address address
employees employees
account_owner { account_owner: accountOwner {
id id
email email
displayName displayName
@@ -41,6 +41,6 @@ export function useCompaniesQuery(
export const defaultOrderBy: Companies_Order_By[] = [ export const defaultOrderBy: Companies_Order_By[] = [
{ {
created_at: Order_By.Desc, createdAt: Order_By.Desc,
}, },
]; ];

View File

@@ -7,88 +7,76 @@ import { apiClient } from '../../../apollo';
export const UPDATE_COMPANY = gql` export const UPDATE_COMPANY = gql`
mutation UpdateCompany( mutation UpdateCompany(
$id: uuid $id: String
$name: String $name: String
$domain_name: String $domain_name: String
$account_owner_id: uuid $account_owner_id: String
$created_at: timestamptz $created_at: DateTime
$address: String $address: String
$employees: numeric $employees: Int
) { ) {
update_companies( updateOneCompany(
where: { id: { _eq: $id } } where: { id: $id }
_set: { data: {
account_owner_id: $account_owner_id accountOwner: { connect: { id: $account_owner_id } }
address: $address address: { set: $address }
domain_name: $domain_name domainName: { set: $domain_name }
employees: $employees employees: { set: $employees }
name: $name name: { set: $name }
created_at: $created_at createdAt: { set: $created_at }
} }
) { ) {
affected_rows accountOwner {
returning {
account_owner {
id
email
displayName
}
address
created_at
domain_name
employees
id id
name email
display_name: displayName
} }
address
created_at: createdAt
domain_name: domainName
employees
id
name
} }
} }
`; `;
export const INSERT_COMPANY = gql` export const INSERT_COMPANY = gql`
mutation InsertCompany( mutation InsertCompany(
$id: uuid $id: String!
$name: String $name: String!
$domain_name: String $domain_name: String!
$account_owner_id: uuid $account_owner_id: String
$created_at: timestamptz $created_at: DateTime
$address: String $address: String!
$employees: numeric $employees: Int
) { ) {
insert_companies( createOneCompany(
objects: { data: {
id: $id id: $id
name: $name name: $name
domain_name: $domain_name domainName: $domain_name
account_owner_id: $account_owner_id accountOwner: { connect: { id: $account_owner_id } }
created_at: $created_at createdAt: $created_at
address: $address address: $address
employees: $employees employees: $employees
workspace: { connect: { id: "il faut rajouter l'id du workspace" } }
} }
) { ) {
affected_rows address
returning { created_at: createdAt
address domain_name: domainName
created_at employees
domain_name id
employees name
id
name
}
} }
} }
`; `;
export const DELETE_COMPANIES = gql` export const DELETE_COMPANIES = gql`
mutation DeleteCompanies($ids: [uuid!]) { mutation DeleteCompanies($ids: [String!]) {
delete_companies(where: { id: { _in: $ids } }) { deleteManyCompany(where: { id: { in: $ids } }) {
returning { count
address
created_at
domain_name
employees
id
name
}
} }
} }
`; `;

View File

@@ -1,9 +1,9 @@
import { QueryResult, gql, useQuery } from '@apollo/client'; import { QueryResult, gql, useQuery } from '@apollo/client';
import { GraphqlQueryPerson } from '../../../interfaces/entities/person.interface'; import { GraphqlQueryPerson } from '../../../interfaces/entities/person.interface';
import { import {
Order_By, PersonWhereInput as People_Bool_Exp,
People_Bool_Exp, PersonOrderByWithRelationInput as People_Order_By,
People_Order_By, SortOrder,
} from '../../../generated/graphql'; } from '../../../generated/graphql';
import { SelectedSortType } from '../../../interfaces/sorts/interface'; import { SelectedSortType } from '../../../interfaces/sorts/interface';
@@ -11,22 +11,22 @@ export type PeopleSelectedSortType = SelectedSortType<People_Order_By>;
export const GET_PEOPLE = gql` export const GET_PEOPLE = gql`
query GetPeople( query GetPeople(
$orderBy: [people_order_by!] $orderBy: [PersonOrderByWithRelationInput!]
$where: people_bool_exp $where: PersonWhereInput
$limit: Int $limit: Int
) { ) {
people(order_by: $orderBy, where: $where, limit: $limit) { people(orderBy: $orderBy, where: $where, take: $limit) {
id id
phone phone
email email
city city
firstname firstname
lastname lastname
created_at created_at: createdAt
company { company {
id id
name name
domain_name domain_name: domainName
} }
} }
} }
@@ -43,6 +43,6 @@ export function usePeopleQuery(
export const defaultOrderBy: People_Order_By[] = [ export const defaultOrderBy: People_Order_By[] = [
{ {
created_at: Order_By.Desc, createdAt: SortOrder.Desc,
}, },
]; ];

View File

@@ -7,105 +7,88 @@ import { apiClient } from '../../../apollo';
export const UPDATE_PERSON = gql` export const UPDATE_PERSON = gql`
mutation UpdatePeople( mutation UpdatePeople(
$id: uuid $id: String
$firstname: String $firstname: String
$lastname: String $lastname: String
$phone: String $phone: String
$city: String $city: String
$company_id: uuid $company_id: String
$email: String $email: String
$created_at: timestamptz $created_at: DateTime
) { ) {
update_people( updateOnePerson(
where: { id: { _eq: $id } } where: { id: $id }
_set: { data: {
city: $city city: { set: $city }
company_id: $company_id company: { connect: { id: $company_id } }
email: $email email: { set: $email }
firstname: $firstname firstname: { set: $firstname }
id: $id id: { set: $id }
lastname: $lastname lastname: { set: $lastname }
phone: $phone phone: { set: $phone }
created_at: $created_at createdAt: { set: $created_at }
} }
) { ) {
returning { city
city company {
company { domain_name: domainName
domain_name name
name
id
}
email
firstname
id id
lastname
phone
created_at
} }
email
firstname
id
lastname
phone
created_at: createdAt
} }
} }
`; `;
export const INSERT_PERSON = gql` export const INSERT_PERSON = gql`
mutation InsertPerson( mutation InsertPerson(
$id: uuid $id: String!
$firstname: String $firstname: String!
$lastname: String $lastname: String!
$phone: String $phone: String!
$city: String $city: String!
$company_id: uuid $company_id: String
$email: String $email: String!
$created_at: timestamptz $created_at: DateTime
) { ) {
insert_people( createOnePerson(
objects: { data: {
id: $id id: $id
firstname: $firstname firstname: $firstname
lastname: $lastname lastname: $lastname
phone: $phone phone: $phone
city: $city city: $city
company_id: $company_id company: { connect: { id: $company_id } }
email: $email email: $email
created_at: $created_at createdAt: $created_at
workspace: { connect: { id: "il faut rajouter l'id du workspace" } }
} }
) { ) {
affected_rows city
returning { company {
city domain_name: domainName
company { name
domain_name
name
id
}
email
firstname
id id
lastname
phone
created_at
} }
email
firstname
id
lastname
phone
created_at: createdAt
} }
} }
`; `;
export const DELETE_PEOPLE = gql` export const DELETE_PEOPLE = gql`
mutation DeletePeople($ids: [uuid!]) { mutation DeletePeople($ids: [String!]) {
delete_people(where: { id: { _in: $ids } }) { deleteManyPerson(where: { id: { in: $ids } }) {
returning { count
city
company {
domain_name
name
id
}
email
firstname
id
lastname
phone
created_at
}
} }
} }
`; `;

View File

@@ -7,22 +7,22 @@ import {
} from '../../../interfaces/entities/generic.interface'; } from '../../../interfaces/entities/generic.interface';
export const SEARCH_PEOPLE_QUERY = gql` export const SEARCH_PEOPLE_QUERY = gql`
query SearchPeopleQuery($where: people_bool_exp, $limit: Int) { query SearchPeopleQuery($where: PersonWhereInput, $limit: Int) {
searchResults: people(where: $where, limit: $limit) { searchResults: people(where: $where, take: $limit) {
id id
phone phone
email email
city city
firstname firstname
lastname lastname
created_at createdAt
} }
} }
`; `;
export const SEARCH_USER_QUERY = gql` export const SEARCH_USER_QUERY = gql`
query SearchUserQuery($where: users_bool_exp, $limit: Int) { query SearchUserQuery($where: UserWhereInput, $limit: Int) {
searchResults: users(where: $where, limit: $limit) { searchResults: users(where: $where, take: $limit) {
id id
email email
displayName displayName
@@ -39,11 +39,11 @@ export const EMPTY_QUERY = gql`
`; `;
export const SEARCH_COMPANY_QUERY = gql` export const SEARCH_COMPANY_QUERY = gql`
query SearchQuery($where: companies_bool_exp, $limit: Int) { query SearchQuery($where: CompanyWhereInput, $limit: Int) {
searchResults: companies(where: $where, limit: $limit) { searchResults: companies(where: $where, take: $limit) {
id id
name name
domain_name domain_name: domainName
} }
} }
`; `;

View File

@@ -2,17 +2,16 @@ import { QueryResult, gql, useQuery } from '@apollo/client';
import { GraphqlQueryUser } from '../../../interfaces/entities/user.interface'; import { GraphqlQueryUser } from '../../../interfaces/entities/user.interface';
export const GET_CURRENT_USER = gql` export const GET_CURRENT_USER = gql`
query GetCurrentUser($uuid: uuid) { query GetCurrentUser($uuid: String) {
users(where: { id: { _eq: $uuid } }) { users(where: { id: { equals: $uuid } }) {
id id
email email
displayName displayName
workspace_member { workspace_member: workspaceMember {
workspace { workspace {
id id
domain_name domain_name: domainName
display_name display_name: displayName
logo
} }
} }
} }

View File

@@ -0,0 +1,9 @@
import { gql } from '@apollo/client';
export const GET_CURRENT_USER = gql`
query getUsers {
users {
id
}
}
`;

View File

@@ -1,6 +0,0 @@
version: 3
endpoint: http://localhost:8080
metadata_directory: metadata
actions:
kind: synchronous
handler_webhook_baseurl: http://localhost:3000

View File

@@ -1,6 +0,0 @@
actions: []
custom_types:
enums: []
input_objects: []
objects: []
scalars: []

View File

@@ -1 +0,0 @@
[]

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
[]

View File

@@ -1,9 +0,0 @@
- name: default
kind: postgres
configuration:
connection_info:
database_url:
from_env: HASURA_GRAPHQL_PG_DATABASE_URL
isolation_level: read-committed
use_prepared_statements: false
tables: "!include default/tables/tables.yaml"

View File

@@ -1,23 +0,0 @@
table:
name: provider_requests
schema: auth
configuration:
column_config:
id:
custom_name: id
options:
custom_name: options
custom_column_names:
id: id
options: options
custom_name: authProviderRequests
custom_root_fields:
delete: deleteAuthProviderRequests
delete_by_pk: deleteAuthProviderRequest
insert: insertAuthProviderRequests
insert_one: insertAuthProviderRequest
select: authProviderRequests
select_aggregate: authProviderRequestsAggregate
select_by_pk: authProviderRequest
update: updateAuthProviderRequests
update_by_pk: updateAuthProviderRequest

View File

@@ -1,28 +0,0 @@
table:
name: providers
schema: auth
configuration:
column_config:
id:
custom_name: id
custom_column_names:
id: id
custom_name: authProviders
custom_root_fields:
delete: deleteAuthProviders
delete_by_pk: deleteAuthProvider
insert: insertAuthProviders
insert_one: insertAuthProvider
select: authProviders
select_aggregate: authProvidersAggregate
select_by_pk: authProvider
update: updateAuthProviders
update_by_pk: updateAuthProvider
array_relationships:
- name: userProviders
using:
foreign_key_constraint_on:
column: provider_id
table:
name: user_providers
schema: auth

View File

@@ -1,36 +0,0 @@
table:
name: refresh_tokens
schema: auth
configuration:
column_config:
created_at:
custom_name: createdAt
expires_at:
custom_name: expiresAt
refresh_token:
custom_name: refreshToken
refresh_token_hash:
custom_name: refreshTokenHash
user_id:
custom_name: userId
custom_column_names:
created_at: createdAt
expires_at: expiresAt
refresh_token: refreshToken
refresh_token_hash: refreshTokenHash
user_id: userId
custom_name: authRefreshTokens
custom_root_fields:
delete: deleteAuthRefreshTokens
delete_by_pk: deleteAuthRefreshToken
insert: insertAuthRefreshTokens
insert_one: insertAuthRefreshToken
select: authRefreshTokens
select_aggregate: authRefreshTokensAggregate
select_by_pk: authRefreshToken
update: updateAuthRefreshTokens
update_by_pk: updateAuthRefreshToken
object_relationships:
- name: user
using:
foreign_key_constraint_on: user_id

View File

@@ -1,35 +0,0 @@
table:
name: roles
schema: auth
configuration:
column_config:
role:
custom_name: role
custom_column_names:
role: role
custom_name: authRoles
custom_root_fields:
delete: deleteAuthRoles
delete_by_pk: deleteAuthRole
insert: insertAuthRoles
insert_one: insertAuthRole
select: authRoles
select_aggregate: authRolesAggregate
select_by_pk: authRole
update: updateAuthRoles
update_by_pk: updateAuthRole
array_relationships:
- name: userRoles
using:
foreign_key_constraint_on:
column: role
table:
name: user_roles
schema: auth
- name: usersByDefaultRole
using:
foreign_key_constraint_on:
column: default_role
table:
name: users
schema: auth

View File

@@ -1,48 +0,0 @@
table:
name: user_providers
schema: auth
configuration:
column_config:
access_token:
custom_name: accessToken
created_at:
custom_name: createdAt
id:
custom_name: id
provider_id:
custom_name: providerId
provider_user_id:
custom_name: providerUserId
refresh_token:
custom_name: refreshToken
updated_at:
custom_name: updatedAt
user_id:
custom_name: userId
custom_column_names:
access_token: accessToken
created_at: createdAt
id: id
provider_id: providerId
provider_user_id: providerUserId
refresh_token: refreshToken
updated_at: updatedAt
user_id: userId
custom_name: authUserProviders
custom_root_fields:
delete: deleteAuthUserProviders
delete_by_pk: deleteAuthUserProvider
insert: insertAuthUserProviders
insert_one: insertAuthUserProvider
select: authUserProviders
select_aggregate: authUserProvidersAggregate
select_by_pk: authUserProvider
update: updateAuthUserProviders
update_by_pk: updateAuthUserProvider
object_relationships:
- name: provider
using:
foreign_key_constraint_on: provider_id
- name: user
using:
foreign_key_constraint_on: user_id

View File

@@ -1,36 +0,0 @@
table:
name: user_roles
schema: auth
configuration:
column_config:
created_at:
custom_name: createdAt
id:
custom_name: id
role:
custom_name: role
user_id:
custom_name: userId
custom_column_names:
created_at: createdAt
id: id
role: role
user_id: userId
custom_name: authUserRoles
custom_root_fields:
delete: deleteAuthUserRoles
delete_by_pk: deleteAuthUserRole
insert: insertAuthUserRoles
insert_one: insertAuthUserRole
select: authUserRoles
select_aggregate: authUserRolesAggregate
select_by_pk: authUserRole
update: updateAuthUserRoles
update_by_pk: updateAuthUserRole
object_relationships:
- name: roleByRole
using:
foreign_key_constraint_on: role
- name: user
using:
foreign_key_constraint_on: user_id

View File

@@ -1,33 +0,0 @@
table:
name: user_security_keys
schema: auth
configuration:
column_config:
credential_id:
custom_name: credentialId
credential_public_key:
custom_name: credentialPublicKey
id:
custom_name: id
user_id:
custom_name: userId
custom_column_names:
credential_id: credentialId
credential_public_key: credentialPublicKey
id: id
user_id: userId
custom_name: authUserSecurityKeys
custom_root_fields:
delete: deleteAuthUserSecurityKeys
delete_by_pk: deleteAuthUserSecurityKey
insert: insertAuthUserSecurityKeys
insert_one: insertAuthUserSecurityKey
select: authUserSecurityKeys
select_aggregate: authUserSecurityKeysAggregate
select_by_pk: authUserSecurityKey
update: updateAuthUserSecurityKeys
update_by_pk: updateAuthUserSecurityKey
object_relationships:
- name: user
using:
foreign_key_constraint_on: user_id

View File

@@ -1,178 +0,0 @@
table:
name: users
schema: auth
configuration:
column_config:
active_mfa_type:
custom_name: activeMfaType
avatar_url:
custom_name: avatarUrl
created_at:
custom_name: createdAt
default_role:
custom_name: defaultRole
disabled:
custom_name: disabled
display_name:
custom_name: displayName
email:
custom_name: email
email_verified:
custom_name: emailVerified
id:
custom_name: id
is_anonymous:
custom_name: isAnonymous
last_seen:
custom_name: lastSeen
locale:
custom_name: locale
new_email:
custom_name: newEmail
otp_hash:
custom_name: otpHash
otp_hash_expires_at:
custom_name: otpHashExpiresAt
otp_method_last_used:
custom_name: otpMethodLastUsed
password_hash:
custom_name: passwordHash
phone_number:
custom_name: phoneNumber
phone_number_verified:
custom_name: phoneNumberVerified
ticket:
custom_name: ticket
ticket_expires_at:
custom_name: ticketExpiresAt
totp_secret:
custom_name: totpSecret
updated_at:
custom_name: updatedAt
webauthn_current_challenge:
custom_name: currentChallenge
custom_column_names:
active_mfa_type: activeMfaType
avatar_url: avatarUrl
created_at: createdAt
default_role: defaultRole
disabled: disabled
display_name: displayName
email: email
email_verified: emailVerified
id: id
is_anonymous: isAnonymous
last_seen: lastSeen
locale: locale
new_email: newEmail
otp_hash: otpHash
otp_hash_expires_at: otpHashExpiresAt
otp_method_last_used: otpMethodLastUsed
password_hash: passwordHash
phone_number: phoneNumber
phone_number_verified: phoneNumberVerified
ticket: ticket
ticket_expires_at: ticketExpiresAt
totp_secret: totpSecret
updated_at: updatedAt
webauthn_current_challenge: currentChallenge
custom_name: users
custom_root_fields:
delete: deleteUsers
delete_by_pk: deleteUser
insert: insertUsers
insert_one: insertUser
select: users
select_aggregate: usersAggregate
select_by_pk: user
update: updateUsers
update_by_pk: updateUser
object_relationships:
- name: defaultRoleByRole
using:
foreign_key_constraint_on: default_role
- name: workspace_member
using:
manual_configuration:
column_mapping:
id: user_id
insertion_order: null
remote_table:
name: workspace_members
schema: public
array_relationships:
- name: refreshTokens
using:
foreign_key_constraint_on:
column: user_id
table:
name: refresh_tokens
schema: auth
- name: roles
using:
foreign_key_constraint_on:
column: user_id
table:
name: user_roles
schema: auth
- name: securityKeys
using:
foreign_key_constraint_on:
column: user_id
table:
name: user_security_keys
schema: auth
- name: userProviders
using:
foreign_key_constraint_on:
column: user_id
table:
name: user_providers
schema: auth
select_permissions:
- role: user
permission:
columns:
- disabled
- email_verified
- is_anonymous
- phone_number_verified
- locale
- metadata
- active_mfa_type
- avatar_url
- default_role
- display_name
- otp_hash
- otp_method_last_used
- password_hash
- phone_number
- ticket
- totp_secret
- webauthn_current_challenge
- created_at
- last_seen
- otp_hash_expires_at
- ticket_expires_at
- updated_at
- email
- new_email
- id
filter:
workspace_member:
workspace_id:
_eq: X-Hasura-Workspace-Id
event_triggers:
- name: user-created
definition:
enable_manual: false
insert:
columns: '*'
retry_conf:
interval_sec: 10
num_retries: 0
timeout_sec: 60
webhook: '{{HASURA_EVENT_HANDLER_URL}}'
headers:
- name: secret-header
value: secret

View File

@@ -1,76 +0,0 @@
table:
name: companies
schema: public
object_relationships:
- name: account_owner
using:
manual_configuration:
column_mapping:
account_owner_id: id
insertion_order: null
remote_table:
name: users
schema: auth
- name: workspace
using:
foreign_key_constraint_on: workspace_id
insert_permissions:
- role: user
permission:
check:
workspace_id:
_eq: x-hasura-workspace-id
set:
workspace_id: x-hasura-Workspace-Id
columns:
- id
- workspace_id
- account_owner_id
- address
- employees
- name
- domain_name
- created_at
- updated_at
- deleted_at
select_permissions:
- role: user
permission:
columns:
- domain_name
- name
- account_owner_id
- address
- employees
- created_at
- deleted_at
- updated_at
- id
- workspace_id
filter:
workspace_id:
_eq: x-hasura-workspace-id
update_permissions:
- role: user
permission:
columns:
- domain_name
- name
- employees
- address
- account_owner_id
- created_at
- deleted_at
- updated_at
- id
- workspace_id
filter:
workspace_id:
_eq: x-hasura-workspace-id
check: null
delete_permissions:
- role: user
permission:
filter:
workspace_id:
_eq: x-hasura-workspace-id

View File

@@ -1,73 +0,0 @@
table:
name: people
schema: public
object_relationships:
- name: company
using:
foreign_key_constraint_on: company_id
- name: workspace
using:
foreign_key_constraint_on: workspace_id
insert_permissions:
- role: user
permission:
check:
workspace_id:
_eq: x-hasura-workspace-id
set:
workspace_id: x-hasura-Workspace-Id
columns:
- city
- email
- firstname
- lastname
- phone
- created_at
- deleted_at
- updated_at
- company_id
- id
- workspace_id
select_permissions:
- role: user
permission:
columns:
- city
- email
- firstname
- lastname
- phone
- created_at
- deleted_at
- updated_at
- company_id
- id
- workspace_id
filter:
workspace_id:
_eq: x-hasura-workspace-id
update_permissions:
- role: user
permission:
columns:
- city
- email
- firstname
- lastname
- phone
- created_at
- deleted_at
- updated_at
- company_id
- id
- workspace_id
filter:
workspace_id:
_eq: x-hasura-workspace-id
check: null
delete_permissions:
- role: user
permission:
filter:
workspace_id:
_eq: x-hasura-workspace-id

View File

@@ -1,25 +0,0 @@
table:
name: persons
schema: public
object_relationships:
- name: company
using:
foreign_key_constraint_on: company_id
- name: workspace
using:
foreign_key_constraint_on: workspace_id
select_permissions:
- role: user
permission:
columns:
- company_id
- id
- workspace_id
- city
- email
- firstname
- lastname
- phone
- created_at
- updated_at
filter: {}

View File

@@ -1,20 +0,0 @@
table:
name: workspace_members
schema: public
object_relationships:
- name: workspace
using:
foreign_key_constraint_on: workspace_id
select_permissions:
- role: user
permission:
columns:
- created_at
- deleted_at
- updated_at
- id
- user_id
- workspace_id
filter:
workspace_id:
_eq: X-Hasura-Workspace-Id

View File

@@ -1,17 +0,0 @@
table:
name: workspaces
schema: public
select_permissions:
- role: user
permission:
columns:
- display_name
- domain_name
- logo
- created_at
- deleted_at
- updated_at
- id
filter:
id:
_eq: X-Hasura-Workspace-Id

View File

@@ -1,12 +0,0 @@
- "!include auth_provider_requests.yaml"
- "!include auth_providers.yaml"
- "!include auth_refresh_tokens.yaml"
- "!include auth_roles.yaml"
- "!include auth_user_providers.yaml"
- "!include auth_user_roles.yaml"
- "!include auth_user_security_keys.yaml"
- "!include auth_users.yaml"
- "!include public_companies.yaml"
- "!include public_people.yaml"
- "!include public_workspace_members.yaml"
- "!include public_workspaces.yaml"

View File

@@ -1 +0,0 @@
disabled_for_roles: []

View File

@@ -1 +0,0 @@
[]

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
{}

View File

@@ -1 +0,0 @@
[]

View File

@@ -1 +0,0 @@
[]

View File

@@ -1 +0,0 @@
[]

View File

@@ -1 +0,0 @@
version: 3

View File

@@ -1 +0,0 @@
DROP TABLE "public"."workspaces";

View File

@@ -1 +0,0 @@
CREATE TABLE "public"."workspaces" ("id" serial NOT NULL, "name" Text NOT NULL, "display_name" text NOT NULL, PRIMARY KEY ("id") , UNIQUE ("id"), UNIQUE ("name"));

View File

@@ -1 +0,0 @@
DROP TABLE "public"."person";

View File

@@ -1 +0,0 @@
CREATE TABLE "public"."person" ("id" serial NOT NULL, "firstname" text, "lastname" text NOT NULL, "company_domain" text, "phone" text, "city" text, PRIMARY KEY ("id") , UNIQUE ("id"));

View File

@@ -1,4 +0,0 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."person" add column "workspace_id" integer
-- not null;

View File

@@ -1,2 +0,0 @@
alter table "public"."person" add column "workspace_id" integer
not null;

View File

@@ -1 +0,0 @@
alter table "public"."person" drop constraint "person_workspace_id_fkey";

View File

@@ -1,5 +0,0 @@
alter table "public"."person"
add constraint "person_workspace_id_fkey"
foreign key ("workspace_id")
references "public"."workspaces"
("id") on update restrict on delete restrict;

View File

@@ -1 +0,0 @@
DROP TABLE "public"."company";

View File

@@ -1 +0,0 @@
CREATE TABLE "public"."company" ("id" serial NOT NULL, "company_name" text NOT NULL, "company_domain" text NOT NULL, "workspace_id" integer NOT NULL, PRIMARY KEY ("id") , FOREIGN KEY ("workspace_id") REFERENCES "public"."workspaces"("id") ON UPDATE restrict ON DELETE restrict);

View File

@@ -1,4 +0,0 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."person" add column "company_id" integer
-- null;

View File

@@ -1,2 +0,0 @@
alter table "public"."person" add column "company_id" integer
null;

View File

@@ -1 +0,0 @@
alter table "public"."person" drop constraint "person_company_id_fkey";

View File

@@ -1,5 +0,0 @@
alter table "public"."person"
add constraint "person_company_id_fkey"
foreign key ("company_id")
references "public"."company"
("id") on update restrict on delete restrict;

View File

@@ -1,2 +0,0 @@
alter table "public"."person" alter column "company_domain" drop not null;
alter table "public"."person" add column "company_domain" text;

View File

@@ -1 +0,0 @@
alter table "public"."person" drop column "company_domain" cascade;

View File

@@ -1,4 +0,0 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."person" add column "email" text
-- null;

View File

@@ -1,2 +0,0 @@
alter table "public"."person" add column "email" text
null;

View File

@@ -1,4 +0,0 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."person" add column "created_at" timestamptz
-- null default now();

View File

@@ -1,2 +0,0 @@
alter table "public"."person" add column "created_at" timestamptz
null default now();

View File

@@ -1,21 +0,0 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."person" add column "updated_at" timestamptz
-- null default now();
--
-- CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"()
-- RETURNS TRIGGER AS $$
-- DECLARE
-- _new record;
-- BEGIN
-- _new := NEW;
-- _new."updated_at" = NOW();
-- RETURN _new;
-- END;
-- $$ LANGUAGE plpgsql;
-- CREATE TRIGGER "set_public_person_updated_at"
-- BEFORE UPDATE ON "public"."person"
-- FOR EACH ROW
-- EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"();
-- COMMENT ON TRIGGER "set_public_person_updated_at" ON "public"."person"
-- IS 'trigger to set value of column "updated_at" to current timestamp on row update';

View File

@@ -1,19 +0,0 @@
alter table "public"."person" add column "updated_at" timestamptz
null default now();
CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"()
RETURNS TRIGGER AS $$
DECLARE
_new record;
BEGIN
_new := NEW;
_new."updated_at" = NOW();
RETURN _new;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER "set_public_person_updated_at"
BEFORE UPDATE ON "public"."person"
FOR EACH ROW
EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"();
COMMENT ON TRIGGER "set_public_person_updated_at" ON "public"."person"
IS 'trigger to set value of column "updated_at" to current timestamp on row update';

View File

@@ -1,4 +0,0 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."company" add column "created_at" timestamptz
-- null default now();

View File

@@ -1,2 +0,0 @@
alter table "public"."company" add column "created_at" timestamptz
null default now();

View File

@@ -1,21 +0,0 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."company" add column "updated_at" timestamptz
-- not null default now();
--
-- CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"()
-- RETURNS TRIGGER AS $$
-- DECLARE
-- _new record;
-- BEGIN
-- _new := NEW;
-- _new."updated_at" = NOW();
-- RETURN _new;
-- END;
-- $$ LANGUAGE plpgsql;
-- CREATE TRIGGER "set_public_company_updated_at"
-- BEFORE UPDATE ON "public"."company"
-- FOR EACH ROW
-- EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"();
-- COMMENT ON TRIGGER "set_public_company_updated_at" ON "public"."company"
-- IS 'trigger to set value of column "updated_at" to current timestamp on row update';

View File

@@ -1,19 +0,0 @@
alter table "public"."company" add column "updated_at" timestamptz
not null default now();
CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"()
RETURNS TRIGGER AS $$
DECLARE
_new record;
BEGIN
_new := NEW;
_new."updated_at" = NOW();
RETURN _new;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER "set_public_company_updated_at"
BEFORE UPDATE ON "public"."company"
FOR EACH ROW
EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"();
COMMENT ON TRIGGER "set_public_company_updated_at" ON "public"."company"
IS 'trigger to set value of column "updated_at" to current timestamp on row update';

View File

@@ -1 +0,0 @@
alter table "public"."company" alter column "created_at" drop not null;

View File

@@ -1 +0,0 @@
alter table "public"."company" alter column "created_at" set not null;

View File

@@ -1 +0,0 @@
alter table "public"."person" alter column "created_at" drop not null;

View File

@@ -1 +0,0 @@
alter table "public"."person" alter column "created_at" set not null;

View File

@@ -1 +0,0 @@
alter table "public"."person" alter column "updated_at" drop not null;

View File

@@ -1 +0,0 @@
alter table "public"."person" alter column "updated_at" set not null;

View File

@@ -1,4 +0,0 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."workspaces" add column "created_at" timestamptz
-- not null default now();

View File

@@ -1,2 +0,0 @@
alter table "public"."workspaces" add column "created_at" timestamptz
not null default now();

View File

@@ -1,21 +0,0 @@
-- Could not auto-generate a down migration.
-- Please write an appropriate down migration for the SQL below:
-- alter table "public"."workspaces" add column "updated_at" timestamptz
-- not null default now();
--
-- CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"()
-- RETURNS TRIGGER AS $$
-- DECLARE
-- _new record;
-- BEGIN
-- _new := NEW;
-- _new."updated_at" = NOW();
-- RETURN _new;
-- END;
-- $$ LANGUAGE plpgsql;
-- CREATE TRIGGER "set_public_workspaces_updated_at"
-- BEFORE UPDATE ON "public"."workspaces"
-- FOR EACH ROW
-- EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"();
-- COMMENT ON TRIGGER "set_public_workspaces_updated_at" ON "public"."workspaces"
-- IS 'trigger to set value of column "updated_at" to current timestamp on row update';

View File

@@ -1,19 +0,0 @@
alter table "public"."workspaces" add column "updated_at" timestamptz
not null default now();
CREATE OR REPLACE FUNCTION "public"."set_current_timestamp_updated_at"()
RETURNS TRIGGER AS $$
DECLARE
_new record;
BEGIN
_new := NEW;
_new."updated_at" = NOW();
RETURN _new;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER "set_public_workspaces_updated_at"
BEFORE UPDATE ON "public"."workspaces"
FOR EACH ROW
EXECUTE PROCEDURE "public"."set_current_timestamp_updated_at"();
COMMENT ON TRIGGER "set_public_workspaces_updated_at" ON "public"."workspaces"
IS 'trigger to set value of column "updated_at" to current timestamp on row update';

View File

@@ -1 +0,0 @@
alter table "public"."companies" rename to "company";

View File

@@ -1 +0,0 @@
alter table "public"."company" rename to "companies";

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