Tony CHEMIT pushed to branch develop at ultreiaio / ird-observe

Commits:

9 changed files:

Changes:

  • client/core/src/main/java/fr/ird/observe/client/datasource/presets/RemotePresetsUI.jaxx
    ... ... @@ -28,20 +28,20 @@
    28 28
       <RemotePresetsUIModel id="model" initializer="getContextValue(RemotePresetsUIModel.class)"/>
    
    29 29
     
    
    30 30
       <JTabbedPane id='tabs' constraints='BorderLayout.CENTER'>
    
    31
    -    <tab id='remoteTab' title="observe.ui.datasource.storage.remote.presets.title">
    
    32
    -      <JPanel id="remotePanel" layout="{new BorderLayout()}">
    
    33
    -        <JScrollPane id='remoteConfigurationsPane' constraints='BorderLayout.CENTER'>
    
    34
    -          <JList id='remoteConfigurations' genericType="RemoteDataSourceConfiguration"/>
    
    31
    +    <tab id='serverTab' title="observe.ui.datasource.storage.server.presets.title">
    
    32
    +      <JPanel id="serverPanel" layout="{new BorderLayout()}">
    
    33
    +        <JScrollPane id='serverConfigurationsPane' constraints='BorderLayout.CENTER'>
    
    34
    +          <JList id='serverConfigurations' genericType="ServerDataSourceConfiguration"/>
    
    35 35
             </JScrollPane>
    
    36
    -        <JPanel id="remoteContentPanel" layout="{new CardLayout()}" constraints='BorderLayout.SOUTH' border='{new TitledBorder("")}'>
    
    37
    -          <JLabel id="noRemoteSelected" constraints='"empty"'/>
    
    38
    -          <Table id="remoteForm" constraints='"form"' fill="both">
    
    36
    +        <JPanel id="serverContentPanel" layout="{new CardLayout()}" constraints='BorderLayout.SOUTH' border='{new TitledBorder("")}'>
    
    37
    +          <JLabel id="noServerSelected" constraints='"empty"'/>
    
    38
    +          <Table id="serverForm" constraints='"form"' fill="both">
    
    39 39
                 <row>
    
    40 40
                   <cell anchor='west'>
    
    41 41
                     <JLabel text='observe.ui.datasource.storage.remote.name'/>
    
    42 42
                   </cell>
    
    43 43
                   <cell weightx='1' fill="both" anchor='east'>
    
    44
    -                <JTextField id="remoteName" onKeyReleased="handler.setRemoteModified(event);"/>
    
    44
    +                <JTextField id="serverName" onKeyReleased="handler.setServerModified(event);"/>
    
    45 45
                   </cell>
    
    46 46
                 </row>
    
    47 47
                 <row>
    
    ... ... @@ -49,7 +49,7 @@
    49 49
                     <JLabel text='observe.ui.datasource.storage.remote.url'/>
    
    50 50
                   </cell>
    
    51 51
                   <cell weightx='1' fill="both" anchor='east'>
    
    52
    -                <JTextField id="remoteUrl" onKeyReleased="handler.setRemoteModified(event);"/>
    
    52
    +                <JTextField id="serverUrl" onKeyReleased="handler.setServerModified(event);"/>
    
    53 53
                   </cell>
    
    54 54
                 </row>
    
    55 55
                 <row>
    
    ... ... @@ -57,7 +57,7 @@
    57 57
                     <JLabel text='observe.ui.datasource.storage.remote.login'/>
    
    58 58
                   </cell>
    
    59 59
                   <cell weightx='1' fill="both" anchor='east'>
    
    60
    -                <JTextField id="remoteLogin" onKeyReleased="handler.setRemoteModified(event);"/>
    
    60
    +                <JTextField id="serverLogin" onKeyReleased="handler.setServerModified(event);"/>
    
    61 61
                   </cell>
    
    62 62
                 </row>
    
    63 63
                 <row>
    
    ... ... @@ -65,24 +65,27 @@
    65 65
                     <JLabel text='observe.ui.datasource.storage.remote.password'/>
    
    66 66
                   </cell>
    
    67 67
                   <cell weightx='1' fill="both" anchor='east'>
    
    68
    -                <JTextField id="remotePassword" onKeyReleased="handler.setRemoteModified(event);"/>
    
    68
    +                <JTextField id="serverPassword" onKeyReleased="handler.setServerModified(event);"/>
    
    69 69
                   </cell>
    
    70 70
                 </row>
    
    71 71
                 <row>
    
    72
    -              <cell columns='2'>
    
    73
    -                <JCheckBox id="remoteUseSsl" onActionPerformed="model.setRemoteModified(true);"/>
    
    72
    +              <cell anchor='west'>
    
    73
    +                <JLabel id="serverDataBaseLabel" text='observe.ui.datasource.storage.server.dataBase'/>
    
    74
    +              </cell>
    
    75
    +              <cell weightx='1' fill="both" anchor='east'>
    
    76
    +                <JTextField id="serverDataBase" onKeyReleased="handler.setServerModified(event);"/>
    
    74 77
                   </cell>
    
    75 78
                 </row>
    
    76 79
     
    
    77 80
                 <row>
    
    78 81
                   <cell columns='2'>
    
    79
    -                <JPanel id="remoteActions" layout="{new GridLayout(1, 0)}">
    
    80
    -                  <JButton id="cancelRemoteAction"/>
    
    81
    -                  <JButton id="resetRemoteAction"/>
    
    82
    -                  <JButton id="saveRemoteAction"/>
    
    83
    -                  <JButton id="deleteRemoteAction"/>
    
    84
    -                  <JButton id="testRemoteAction"/>
    
    85
    -                  <JButton id="duplicateRemoteAction"/>
    
    82
    +                <JPanel id="serverActions" layout="{new GridLayout(1, 0)}">
    
    83
    +                  <JButton id="cancelServerAction"/>
    
    84
    +                  <JButton id="resetServerAction"/>
    
    85
    +                  <JButton id="saveServerAction"/>
    
    86
    +                  <JButton id="deleteServerAction"/>
    
    87
    +                  <JButton id="testServerAction"/>
    
    88
    +                  <JButton id="duplicateServerAction"/>
    
    86 89
                     </JPanel>
    
    87 90
                   </cell>
    
    88 91
                 </row>
    
    ... ... @@ -90,21 +93,20 @@
    90 93
             </JPanel>
    
    91 94
           </JPanel>
    
    92 95
         </tab>
    
    93
    -    <tab id='serverTab' title="observe.ui.datasource.storage.server.presets.title">
    
    94
    -
    
    95
    -      <JPanel id="serverPanel" layout="{new BorderLayout()}">
    
    96
    -        <JScrollPane id='serverConfigurationsPane' constraints='BorderLayout.CENTER'>
    
    97
    -          <JList id='serverConfigurations' genericType="ServerDataSourceConfiguration"/>
    
    96
    +    <tab id='remoteTab' title="observe.ui.datasource.storage.remote.presets.title">
    
    97
    +      <JPanel id="remotePanel" layout="{new BorderLayout()}">
    
    98
    +        <JScrollPane id='remoteConfigurationsPane' constraints='BorderLayout.CENTER'>
    
    99
    +          <JList id='remoteConfigurations' genericType="RemoteDataSourceConfiguration"/>
    
    98 100
             </JScrollPane>
    
    99
    -        <JPanel id="serverContentPanel" layout="{new CardLayout()}" constraints='BorderLayout.SOUTH' border='{new TitledBorder("")}'>
    
    100
    -          <JLabel id="noServerSelected" constraints='"empty"'/>
    
    101
    -          <Table id="serverForm" constraints='"form"' fill="both">
    
    101
    +        <JPanel id="remoteContentPanel" layout="{new CardLayout()}" constraints='BorderLayout.SOUTH' border='{new TitledBorder("")}'>
    
    102
    +          <JLabel id="noRemoteSelected" constraints='"empty"'/>
    
    103
    +          <Table id="remoteForm" constraints='"form"' fill="both">
    
    102 104
                 <row>
    
    103 105
                   <cell anchor='west'>
    
    104 106
                     <JLabel text='observe.ui.datasource.storage.remote.name'/>
    
    105 107
                   </cell>
    
    106 108
                   <cell weightx='1' fill="both" anchor='east'>
    
    107
    -                <JTextField id="serverName" onKeyReleased="handler.setServerModified(event);"/>
    
    109
    +                <JTextField id="remoteName" onKeyReleased="handler.setRemoteModified(event);"/>
    
    108 110
                   </cell>
    
    109 111
                 </row>
    
    110 112
                 <row>
    
    ... ... @@ -112,7 +114,7 @@
    112 114
                     <JLabel text='observe.ui.datasource.storage.remote.url'/>
    
    113 115
                   </cell>
    
    114 116
                   <cell weightx='1' fill="both" anchor='east'>
    
    115
    -                <JTextField id="serverUrl" onKeyReleased="handler.setServerModified(event);"/>
    
    117
    +                <JTextField id="remoteUrl" onKeyReleased="handler.setRemoteModified(event);"/>
    
    116 118
                   </cell>
    
    117 119
                 </row>
    
    118 120
                 <row>
    
    ... ... @@ -120,7 +122,7 @@
    120 122
                     <JLabel text='observe.ui.datasource.storage.remote.login'/>
    
    121 123
                   </cell>
    
    122 124
                   <cell weightx='1' fill="both" anchor='east'>
    
    123
    -                <JTextField id="serverLogin" onKeyReleased="handler.setServerModified(event);"/>
    
    125
    +                <JTextField id="remoteLogin" onKeyReleased="handler.setRemoteModified(event);"/>
    
    124 126
                   </cell>
    
    125 127
                 </row>
    
    126 128
                 <row>
    
    ... ... @@ -128,27 +130,23 @@
    128 130
                     <JLabel text='observe.ui.datasource.storage.remote.password'/>
    
    129 131
                   </cell>
    
    130 132
                   <cell weightx='1' fill="both" anchor='east'>
    
    131
    -                <JTextField id="serverPassword" onKeyReleased="handler.setServerModified(event);"/>
    
    133
    +                <JTextField id="remotePassword" onKeyReleased="handler.setRemoteModified(event);"/>
    
    132 134
                   </cell>
    
    133 135
                 </row>
    
    134 136
                 <row>
    
    135
    -              <cell anchor='west'>
    
    136
    -                <JLabel id="serverDataBaseLabel" text='observe.ui.datasource.storage.server.dataBase'/>
    
    137
    -              </cell>
    
    138
    -              <cell weightx='1' fill="both" anchor='east'>
    
    139
    -                <JTextField id="serverDataBase" onKeyReleased="handler.setServerModified(event);"/>
    
    137
    +              <cell columns='2'>
    
    138
    +                <JCheckBox id="remoteUseSsl" onActionPerformed="model.setRemoteModified(true);"/>
    
    140 139
                   </cell>
    
    141 140
                 </row>
    
    142
    -
    
    143 141
                 <row>
    
    144 142
                   <cell columns='2'>
    
    145
    -                <JPanel id="serverActions" layout="{new GridLayout(1, 0)}">
    
    146
    -                  <JButton id="cancelServerAction"/>
    
    147
    -                  <JButton id="resetServerAction"/>
    
    148
    -                  <JButton id="saveServerAction"/>
    
    149
    -                  <JButton id="deleteServerAction"/>
    
    150
    -                  <JButton id="testServerAction"/>
    
    151
    -                  <JButton id="duplicateServerAction"/>
    
    143
    +                <JPanel id="remoteActions" layout="{new GridLayout(1, 0)}">
    
    144
    +                  <JButton id="cancelRemoteAction"/>
    
    145
    +                  <JButton id="resetRemoteAction"/>
    
    146
    +                  <JButton id="saveRemoteAction"/>
    
    147
    +                  <JButton id="deleteRemoteAction"/>
    
    148
    +                  <JButton id="testRemoteAction"/>
    
    149
    +                  <JButton id="duplicateRemoteAction"/>
    
    152 150
                     </JPanel>
    
    153 151
                   </cell>
    
    154 152
                 </row>
    

  • client/datasource/editor/api/src/main/i18n/getters/java.getter
    ... ... @@ -34,6 +34,7 @@ observe.Common.id
    34 34
     observe.Common.label
    
    35 35
     observe.Common.lastUpdateDate
    
    36 36
     observe.Common.list.message.none
    
    37
    +observe.Common.navigation.config.groupByName
    
    37 38
     observe.Common.needComment
    
    38 39
     observe.Common.storage.not.valid
    
    39 40
     observe.Common.technicalInformation
    
    ... ... @@ -165,7 +166,6 @@ observe.ui.action.info.storage
    165 166
     observe.ui.action.info.storage.tip
    
    166 167
     observe.ui.action.load.from.file
    
    167 168
     observe.ui.action.load.from.file.tip
    
    168
    -observe.ui.action.move.groupBy.configuration
    
    169 169
     observe.ui.action.move.layout.multiple.message
    
    170 170
     observe.ui.action.move.layout.single.message
    
    171 171
     observe.ui.action.move.message
    

  • core/services/i18n/src/main/i18n/translations/services_en_GB.properties
    ... ... @@ -1262,14 +1262,14 @@ observe.data.ps.observation.Route.choice.create.fin.veille.activity=Create end a
    1262 1262
     observe.data.ps.observation.Route.choice.not.create.fin.veille.activity.and.continue=do not create end watch activity and continue
    
    1263 1263
     observe.data.ps.observation.Route.date=Date
    
    1264 1264
     observe.data.ps.observation.Route.endLogValue=End log value
    
    1265
    -observe.data.ps.observation.Route.list.navigation.node=Observations
    
    1266
    -observe.data.ps.observation.Route.list.title=Observations - List of roads
    
    1265
    +observe.data.ps.observation.Route.list.navigation.node=Onboard observationsOnboard observations
    
    1266
    +observe.data.ps.observation.Route.list.title=Onboard observations - List of roads
    
    1267 1267
     observe.data.ps.observation.Route.message.need.fin.veille.activity=No end watch activity was found in route to close.\n You can\:\n\n\t- Close route without creating the end watch activity\n\t- Create and go the end watch activity\n\t- Cancel and go back to route
    
    1268 1268
     observe.data.ps.observation.Route.message.not.open=Current route is not open, no modification is possible.
    
    1269 1269
     observe.data.ps.observation.Route.navigation.unsaved=New route
    
    1270 1270
     observe.data.ps.observation.Route.startLogValue=Start log value
    
    1271
    -observe.data.ps.observation.Route.title=Route
    
    1272
    -observe.data.ps.observation.Route.type=Route
    
    1271
    +observe.data.ps.observation.Route.title=Onboard observations
    
    1272
    +observe.data.ps.observation.Route.type=Onboard observations
    
    1273 1273
     observe.data.ps.observation.Route.validation.activityEndOfSearching.notAvailable=There is already an end watch activity on trip.
    
    1274 1274
     observe.data.ps.observation.Route.validation.date.after.currentPsCommonTrip.startDate=Date (%2$s) must be after trip start date (%1$s).
    
    1275 1275
     observe.data.ps.observation.Route.validation.invalid.endLogValue.maximum=End log can't be before start log.
    

  • core/services/i18n/src/main/i18n/translations/services_es_ES.properties
    ... ... @@ -1262,14 +1262,14 @@ observe.data.ps.observation.Route.choice.create.fin.veille.activity=Crear la act
    1262 1262
     observe.data.ps.observation.Route.choice.not.create.fin.veille.activity.and.continue=No crear la actividad de fin de guardia y continuar
    
    1263 1263
     observe.data.ps.observation.Route.date=Día de observación
    
    1264 1264
     observe.data.ps.observation.Route.endLogValue=Corredera de tarde (millas)
    
    1265
    -observe.data.ps.observation.Route.list.navigation.node=Observations
    
    1265
    +observe.data.ps.observation.Route.list.navigation.node=Observaciones
    
    1266 1266
     observe.data.ps.observation.Route.list.title=List of roads \#TODO
    
    1267 1267
     observe.data.ps.observation.Route.message.need.fin.veille.activity=Ninguna actividad de fin de guardia registrada en la ruta a cerrar.\n Puede \:\n\n\t- Continuar con el cierra de la ruta sin crear la actividad de fin de guardia\n\t- Crear la actividad de fin de guardia e ir a ella\n\t- Cancelar el cierre y continuar con la ruta
    
    1268 1268
     observe.data.ps.observation.Route.message.not.open=la ruta actual no está abierta, no se pueden hacer modificaciones.
    
    1269 1269
     observe.data.ps.observation.Route.navigation.unsaved=New ruta
    
    1270 1270
     observe.data.ps.observation.Route.startLogValue=Corredera de mañana (millas)
    
    1271
    -observe.data.ps.observation.Route.title=Ruta
    
    1272
    -observe.data.ps.observation.Route.type=Ruta
    
    1271
    +observe.data.ps.observation.Route.title=Observaciones
    
    1272
    +observe.data.ps.observation.Route.type=Observaciones
    
    1273 1273
     observe.data.ps.observation.Route.validation.activityEndOfSearching.notAvailable=Existe una actividad de fin de guardia en la ruta.
    
    1274 1274
     observe.data.ps.observation.Route.validation.date.after.currentPsCommonTrip.startDate=El día de observación (%2$s) debe ser superior o igual a la fecha de comienzo de marea (%1$s).
    
    1275 1275
     observe.data.ps.observation.Route.validation.invalid.endLogValue.maximum=La corredera de tarde no puede ser superior en %1$s a la de mañana.
    

  • core/services/i18n/src/main/i18n/translations/services_fr_FR.properties
    ... ... @@ -1262,14 +1262,14 @@ observe.data.ps.observation.Route.choice.create.fin.veille.activity=Créer l'act
    1262 1262
     observe.data.ps.observation.Route.choice.not.create.fin.veille.activity.and.continue=Ne pas créer l'activité de fin de veille et continuer
    
    1263 1263
     observe.data.ps.observation.Route.date=Jour d'observation
    
    1264 1264
     observe.data.ps.observation.Route.endLogValue=Loch du soir (milles)
    
    1265
    -observe.data.ps.observation.Route.list.navigation.node=Observations
    
    1266
    -observe.data.ps.observation.Route.list.title=Liste des routes
    
    1265
    +observe.data.ps.observation.Route.list.navigation.node=Observations embarquées
    
    1266
    +observe.data.ps.observation.Route.list.title=Liste des observations emabrquées
    
    1267 1267
     observe.data.ps.observation.Route.message.need.fin.veille.activity=Aucune activité de fin de veille enregistrée sur la route à clôturer.\nVous pouvez \:\n\n\t- Continuer la clôture de la route sans créer cette activité de fin de veille\n\t- Créer l'activité de fin de veille et vous y rendre\n\t- Annuler la fermeture et rester sur la route
    
    1268 1268
     observe.data.ps.observation.Route.message.not.open=La route courante n'est pas ouverte, aucune modification possible.
    
    1269 1269
     observe.data.ps.observation.Route.navigation.unsaved=Nouvelle route
    
    1270 1270
     observe.data.ps.observation.Route.startLogValue=Loch du matin (milles)
    
    1271
    -observe.data.ps.observation.Route.title=Route
    
    1272
    -observe.data.ps.observation.Route.type=Route
    
    1271
    +observe.data.ps.observation.Route.title=Observations embarquées
    
    1272
    +observe.data.ps.observation.Route.type=Observations embarquées
    
    1273 1273
     observe.data.ps.observation.Route.validation.activityEndOfSearching.notAvailable=Il existe déjà une activité de fin de veille sur la route
    
    1274 1274
     observe.data.ps.observation.Route.validation.date.after.currentPsCommonTrip.startDate=Le jour d'observation (%2$s) doit être supérieure ou égale à la date de début de la marée (%1$s).
    
    1275 1275
     observe.data.ps.observation.Route.validation.invalid.endLogValue.maximum=Le loch du soir ne peut pas être supérieur de %1$s à celui du matin.
    

  • server/configuration/src/main/java/fr/ird/observe/server/configuration/ServerResources.java
    ... ... @@ -40,7 +40,7 @@ public class ServerResources {
    40 40
         public static final ConfigResource2 SECURITY_CONFIGURATION = new ConfigResource2("/META-INF/configuration/security.yml");
    
    41 41
         public static final ConfigResource2 LOG_CONFIGURATION = new ConfigResource2("/META-INF/configuration/log.xml");
    
    42 42
     
    
    43
    -    static class ConfigResource2 extends ConfigResource {
    
    43
    +    public static class ConfigResource2 extends ConfigResource {
    
    44 44
     
    
    45 45
             private boolean strict;
    
    46 46
             private boolean forWindows;
    

  • server/configuration/src/test/java/fr/ird/observe/dto/server/ServerModelTest.java
    ... ... @@ -23,6 +23,7 @@ package fr.ird.observe.dto.server;
    23 23
      */
    
    24 24
     
    
    25 25
     import fr.ird.observe.server.configuration.ServerConfig;
    
    26
    +import fr.ird.observe.server.configuration.ServerResources;
    
    26 27
     import org.junit.Assert;
    
    27 28
     import org.junit.Before;
    
    28 29
     import org.junit.Test;
    
    ... ... @@ -47,6 +48,33 @@ public class ServerModelTest {
    47 48
             configuration = ServerConfig.forTest();
    
    48 49
         }
    
    49 50
     
    
    51
    +
    
    52
    +    @Test
    
    53
    +    public void testLoad_issue_2284() {
    
    54
    +
    
    55
    +        ServerResources.ConfigResource2 securityConfiguration = new ServerResources.ConfigResource2("/META-INF/configuration/security-2284.yml");
    
    56
    +
    
    57
    +        String content = String.join("\n", securityConfiguration.readLines());
    
    58
    +        ServerModel model = ServerModelHelper.load(content);
    
    59
    +        try {
    
    60
    +            ServerModelHelper.validate(model);
    
    61
    +            Assert.fail("Should have an error");
    
    62
    +        } catch (InvalidServerModelException e) {
    
    63
    +            Assert.assertEquals("Should have found this message error", "Found two default databases: production and test", e.getMessage());
    
    64
    +        }
    
    65
    +
    
    66
    +        securityConfiguration = new ServerResources.ConfigResource2("/META-INF/configuration/security-2284-2.yml");
    
    67
    +
    
    68
    +        content = String.join("\n", securityConfiguration.readLines());
    
    69
    +         model = ServerModelHelper.load(content);
    
    70
    +        try {
    
    71
    +            ServerModelHelper.validate(model);
    
    72
    +            Assert.fail("Should have an error");
    
    73
    +        } catch (InvalidServerModelException e) {
    
    74
    +            Assert.assertEquals("Should have found this message error", "No default databases defined", e.getMessage());
    
    75
    +        }
    
    76
    +    }
    
    77
    +
    
    50 78
         @Test
    
    51 79
         public void testLoad() throws Exception {
    
    52 80
     
    

  • server/configuration/src/test/resources/META-INF/configuration/security-2284-2.yml
    1
    +roles:
    
    2
    +  - &role-admin
    
    3
    +    password: a
    
    4
    +  - &role-technicien
    
    5
    +    password: a
    
    6
    +  - &role-referentiel
    
    7
    +    password: a
    
    8
    +  - &role-test
    
    9
    +    password: a
    
    10
    +databases:
    
    11
    +  - &db-production
    
    12
    +    url: jdbc:postgresql://localhost:5432/obstuna-production
    
    13
    +    roles:
    
    14
    +      - *role-admin
    
    15
    +      - *role-technicien
    
    16
    +      - *role-referentiel
    
    17
    +  - &db-test
    
    18
    +    url: jdbc:postgresql://localhost:5432/obstuna-test
    
    19
    +    roles:
    
    20
    +      - *role-admin
    
    21
    +      - *role-technicien
    
    22
    +      - *role-referentiel
    
    23
    +      - *role-test
    
    24
    +users:
    
    25
    +  - login: utilisateur-technicien
    
    26
    +    password: a
    
    27
    +    permissions:
    
    28
    +      - database: *db-production
    
    29
    +        role: *role-technicien
    
    30
    +        apiAccess: ALL
    
    31
    +        validationMode: STRONG
    
    32
    +      - database: *db-test
    
    33
    +        role: *role-technicien
    
    34
    +        apiAccess: PUBLIC
    
    35
    +        validationMode: PERMISSIVE
    
    36
    +  - login: utilisateur-referentiel
    
    37
    +    password: a
    
    38
    +    permissions:
    
    39
    +      - database: *db-production
    
    40
    +        role: *role-referentiel
    
    41
    +        apiAccess: CLIENT
    
    42
    +        validationMode: NONE

  • server/configuration/src/test/resources/META-INF/configuration/security-2284.yml
    1
    +roles:
    
    2
    +  - &role-admin
    
    3
    +    password: a
    
    4
    +  - &role-technicien
    
    5
    +    password: a
    
    6
    +  - &role-referentiel
    
    7
    +    password: a
    
    8
    +  - &role-test
    
    9
    +    password: a
    
    10
    +databases:
    
    11
    +  - &db-production
    
    12
    +    url: jdbc:postgresql://localhost:5432/obstuna-production
    
    13
    +    defaultDatabase: true
    
    14
    +    roles:
    
    15
    +      - *role-admin
    
    16
    +      - *role-technicien
    
    17
    +      - *role-referentiel
    
    18
    +  - &db-test
    
    19
    +    url: jdbc:postgresql://localhost:5432/obstuna-test
    
    20
    +    defaultDatabase: true
    
    21
    +    roles:
    
    22
    +      - *role-admin
    
    23
    +      - *role-technicien
    
    24
    +      - *role-referentiel
    
    25
    +      - *role-test
    
    26
    +users:
    
    27
    +  - login: utilisateur-technicien
    
    28
    +    password: a
    
    29
    +    permissions:
    
    30
    +      - database: *db-production
    
    31
    +        role: *role-technicien
    
    32
    +        apiAccess: ALL
    
    33
    +        validationMode: STRONG
    
    34
    +      - database: *db-test
    
    35
    +        role: *role-technicien
    
    36
    +        apiAccess: PUBLIC
    
    37
    +        validationMode: PERMISSIVE
    
    38
    +  - login: utilisateur-referentiel
    
    39
    +    password: a
    
    40
    +    permissions:
    
    41
    +      - database: *db-production
    
    42
    +        role: *role-referentiel
    
    43
    +        apiAccess: CLIENT
    
    44
    +        validationMode: NONE