Compare commits

..

34 Commits

Author SHA1 Message Date
carteronm 5d26572073 Merge remote-tracking branch 'origin/develop' into develop 2026-06-11 01:51:04 +02:00
carteronm 0b69eee16b Rôles ajoutés 2026-06-11 01:50:58 +02:00
gokhoal d43b6b746d Merge remote-tracking branch 'origin/develop' into develop 2026-06-11 01:30:43 +02:00
gokhoal dccc2a5e4d LES MESSAGES MARCHENT 2026-06-11 01:30:33 +02:00
carteronm 673269e2b8 Création de groupe terminé + affichage des noms d'utilisateur dans la discussion 2026-06-11 01:15:04 +02:00
carteronm 6ffcece3fa création de groupe début 2026-06-11 00:26:25 +02:00
gokhoal 1c663913a7 LES DISCUSSIONS S'AFFICHENT 2026-06-10 23:39:42 +02:00
gokhoal e386897dc9 Merge remote-tracking branch 'origin/develop' into develop 2026-06-10 23:30:38 +02:00
gokhoal 79cb219a38 creation de discussions 2026-06-10 23:30:31 +02:00
carteronm aec268fbce openapi réalisé encore 2026-06-10 22:50:23 +02:00
gokhoal fd8d33642e logique de creation de discussions 2026-06-10 22:46:03 +02:00
gokhoal 127023fd7f Merge remote-tracking branch 'origin/develop' into develop 2026-06-10 22:36:35 +02:00
carteronm 96dfc905f9 Merge remote-tracking branch 'origin/develop' into develop 2026-06-10 22:36:41 +02:00
carteronm baee754ee8 Register terminé 2026-06-10 22:36:35 +02:00
gokhoal 7ceafb61f8 chargements des discussions 2026-06-10 22:36:26 +02:00
gokhoal 95de4cca9e Merge remote-tracking branch 'origin/develop' into develop 2026-06-10 22:11:17 +02:00
gokhoal a5c8a83281 chargement des messages 2026-06-10 22:11:03 +02:00
carteronm 3e58f8026f Déconnexion 2026-06-10 22:10:13 +02:00
carteronm d7e3a93c04 Debut parametres profil 2026-06-10 17:26:46 +02:00
carteronm cc87ceeacd Login marche ! 2026-06-10 16:27:04 +02:00
gokhoal 18a8ecb351 non used imports 2026-06-10 15:59:19 +02:00
gokhoal dcb715703e Merge remote-tracking branch 'origin/develop' into develop 2026-06-10 15:58:50 +02:00
gokhoal e5044c8940 nouveau register 2026-06-10 15:58:43 +02:00
carteronm 05ee858f04 Merge remote-tracking branch 'origin/develop' into develop 2026-06-10 14:35:24 +02:00
carteronm 98d2465c38 nav début 2026-06-10 14:35:14 +02:00
gokhoal d18735bd4b services chat et discussion 2026-06-10 14:30:17 +02:00
carteronm cb0ebe3c92 openapi fait 2026-06-10 13:53:50 +02:00
gokhoal eb87d15f94 login et register + chat et discussion services 2026-06-10 13:21:54 +02:00
carteronm 60d8e5d588 Parameters terminés 2026-06-10 11:59:04 +02:00
carteronm b85d09ee55 Début du login + parametres 2026-06-10 11:49:23 +02:00
gokhoal 1cc9688d00 changement de la logique des messages 2026-06-08 21:31:41 +02:00
carteronm bff995151f Merge remote-tracking branch 'origin/develop' into develop 2026-05-12 10:47:19 +02:00
carteronm e4e0f9c457 début affichage des utilisateurs 2026-05-12 10:47:14 +02:00
oistig 3975b60496 ajout du service de messages 2026-05-12 10:26:58 +02:00
80 changed files with 2795 additions and 468 deletions
+2 -10
View File
@@ -3,7 +3,6 @@ apply plugin: 'com.android.application'
android { android {
namespace = "com.knots.mobile" namespace = "com.knots.mobile"
compileSdk = rootProject.ext.compileSdkVersion compileSdk = rootProject.ext.compileSdkVersion
defaultConfig { defaultConfig {
applicationId "com.knots.mobile" applicationId "com.knots.mobile"
minSdkVersion rootProject.ext.minSdkVersion minSdkVersion rootProject.ext.minSdkVersion
@@ -11,19 +10,12 @@ android {
versionCode 1 versionCode 1
versionName "1.0" versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
aaptOptions { aaptOptions {
// Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps. // Files and dirs to omit from the packaged assets dir, modified to accommodate modern web apps.
// Default: https://android.googlesource.com/platform/frameworks/base/+/282e181b58cf72b6ca770dc7ca5f91f135444502/tools/aapt/AaptAssets.cpp#61
ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~' ignoreAssetsPattern = '!.svn:!.git:!.ds_store:!*.scc:.*:!CVS:!thumbs.db:!picasa.ini:!*~'
} }
} }
// ✅ Forcer Java 17
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
targetCompatibility JavaVersion.VERSION_17
}
buildTypes { buildTypes {
release { release {
minifyEnabled false minifyEnabled false
@@ -33,7 +25,7 @@ android {
} }
repositories { repositories {
flatDir { flatDir{
dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs' dirs '../capacitor-cordova-android-plugins/src/main/libs', 'libs'
} }
} }
+2 -2
View File
@@ -1,7 +1,7 @@
<?xml version='1.0' encoding='utf-8'?> <?xml version='1.0' encoding='utf-8'?>
<resources> <resources>
<string name="app_name">Knots</string> <string name="app_name">knots</string>
<string name="title_activity_main">Knots</string> <string name="title_activity_main">knots</string>
<string name="package_name">com.knots.mobile</string> <string name="package_name">com.knots.mobile</string>
<string name="custom_url_scheme">com.knots.mobile</string> <string name="custom_url_scheme">com.knots.mobile</string>
</resources> </resources>
-9
View File
@@ -2,15 +2,6 @@
buildscript { buildscript {
allprojects {
gradle.projectsEvaluated {
tasks.withType(JavaCompile) {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
}
}
repositories { repositories {
google() google()
mavenCentral() mavenCentral()
+2
View File
@@ -115,6 +115,8 @@
}, },
"serve": { "serve": {
"builder": "@angular-devkit/build-angular:dev-server", "builder": "@angular-devkit/build-angular:dev-server",
"options": {
"proxyConfig": "proxy.conf.json"},
"configurations": { "configurations": {
"production": { "production": {
"buildTarget": "Knots-Front:build:production" "buildTarget": "Knots-Front:build:production"
+2 -2
View File
@@ -2,8 +2,8 @@ import type { CapacitorConfig } from '@capacitor/cli';
const config: CapacitorConfig = { const config: CapacitorConfig = {
appId: 'com.knots.mobile', appId: 'com.knots.mobile',
appName: 'Knots', appName: 'knots',
webDir: 'dist/knots-front/browser' webDir: 'dist'
}; };
export default config; export default config;
+183 -27
View File
@@ -19,7 +19,9 @@
"@capacitor/angular": "^2.0.3", "@capacitor/angular": "^2.0.3",
"@capacitor/core": "latest", "@capacitor/core": "latest",
"@capacitor/ios": "^8.3.0", "@capacitor/ios": "^8.3.0",
"@capacitor/push-notifications": "^8.0.4",
"@ionic/angular": "^8.8.3", "@ionic/angular": "^8.8.3",
"@microsoft/signalr": "^10.0.0",
"@openapitools/openapi-generator-cli": "^2.32.0", "@openapitools/openapi-generator-cli": "^2.32.0",
"rxjs": "~7.8.0", "rxjs": "~7.8.0",
"tslib": "^2.3.0", "tslib": "^2.3.0",
@@ -245,6 +247,7 @@
"resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.23.tgz", "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-19.2.23.tgz",
"integrity": "sha512-RazHPQkUEsNU/OZ75w9UeHxGFMthRiuAW2B/uA7eXExBj/1meHrrBfoCA56ujW2GUxVjRtSrMjylKh4R4meiYA==", "integrity": "sha512-RazHPQkUEsNU/OZ75w9UeHxGFMthRiuAW2B/uA7eXExBj/1meHrrBfoCA56ujW2GUxVjRtSrMjylKh4R4meiYA==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"ajv": "8.18.0", "ajv": "8.18.0",
"ajv-formats": "3.0.1", "ajv-formats": "3.0.1",
@@ -281,6 +284,7 @@
"resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.23.tgz", "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-19.2.23.tgz",
"integrity": "sha512-Jzs7YM4X6azmHU7Mw5tQSPMuvaqYS8SLnZOJbtiXCy1JyuW9bm/WBBecNHMiuZ8LHXKhvQ6AVX1tKrzF6uiDmw==", "integrity": "sha512-Jzs7YM4X6azmHU7Mw5tQSPMuvaqYS8SLnZOJbtiXCy1JyuW9bm/WBBecNHMiuZ8LHXKhvQ6AVX1tKrzF6uiDmw==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@angular-devkit/core": "19.2.23", "@angular-devkit/core": "19.2.23",
"jsonc-parser": "3.3.1", "jsonc-parser": "3.3.1",
@@ -428,6 +432,7 @@
"resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.20.tgz", "resolved": "https://registry.npmjs.org/@angular/common/-/common-19.2.20.tgz",
"integrity": "sha512-1M3W3FjUUbVKXDMs+yQpBhnkD/pCe0Jn79rPE5W+EGWWxFoLSyGX+fhnRO5m4c9k66p3nvYrikWQ0ZzMv3M5tw==", "integrity": "sha512-1M3W3FjUUbVKXDMs+yQpBhnkD/pCe0Jn79rPE5W+EGWWxFoLSyGX+fhnRO5m4c9k66p3nvYrikWQ0ZzMv3M5tw==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@@ -444,6 +449,7 @@
"resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.20.tgz", "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-19.2.20.tgz",
"integrity": "sha512-LvjE8W58EACgTFaAoqmNe7FRsbvoQ0GvCB/rmm6AEMWx/0W/JBvWkQTrOQlwpoeYOHcMZRGdmPcZoUDwU3JySQ==", "integrity": "sha512-LvjE8W58EACgTFaAoqmNe7FRsbvoQ0GvCB/rmm6AEMWx/0W/JBvWkQTrOQlwpoeYOHcMZRGdmPcZoUDwU3JySQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@@ -457,6 +463,7 @@
"integrity": "sha512-tYYQk8AUz2sEkVl0a3uebduDUXPuKiGEKl2Jryrbn0xh9i1EsxoCjt1VvHnGnksGp3mz4DQihFVEnte0KeVQ5g==", "integrity": "sha512-tYYQk8AUz2sEkVl0a3uebduDUXPuKiGEKl2Jryrbn0xh9i1EsxoCjt1VvHnGnksGp3mz4DQihFVEnte0KeVQ5g==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@babel/core": "7.26.9", "@babel/core": "7.26.9",
"@jridgewell/sourcemap-codec": "^1.4.14", "@jridgewell/sourcemap-codec": "^1.4.14",
@@ -533,6 +540,7 @@
"resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.20.tgz", "resolved": "https://registry.npmjs.org/@angular/core/-/core-19.2.20.tgz",
"integrity": "sha512-pxzQh8ouqfE57lJlXjIzXFuRETwkfMVwS+NFCfv2yh01Qtx+vymO8ZClcJMgLPfBYinhBYX+hrRYVSa1nzlkRQ==", "integrity": "sha512-pxzQh8ouqfE57lJlXjIzXFuRETwkfMVwS+NFCfv2yh01Qtx+vymO8ZClcJMgLPfBYinhBYX+hrRYVSa1nzlkRQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@@ -549,6 +557,7 @@
"resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.20.tgz", "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-19.2.20.tgz",
"integrity": "sha512-agi7InbMzop1jrud6L7SlNwnZk3iNolORcFIwBQMvKxLkcJ+ttbSYuM0KAw56IundWHf4dL9GP4cSygm4kUeFA==", "integrity": "sha512-agi7InbMzop1jrud6L7SlNwnZk3iNolORcFIwBQMvKxLkcJ+ttbSYuM0KAw56IundWHf4dL9GP4cSygm4kUeFA==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@@ -567,6 +576,7 @@
"resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.20.tgz", "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-19.2.20.tgz",
"integrity": "sha512-O9ZoQKILPC1T2c64OASS75XlOLBxY81m5AAgsBKhwiFWq+V28RsO0cnwpi1YSh/z4ryH8Fe7IUFz8jGrsJi3hQ==", "integrity": "sha512-O9ZoQKILPC1T2c64OASS75XlOLBxY81m5AAgsBKhwiFWq+V28RsO0cnwpi1YSh/z4ryH8Fe7IUFz8jGrsJi3hQ==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@@ -607,6 +617,7 @@
"resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.20.tgz", "resolved": "https://registry.npmjs.org/@angular/router/-/router-19.2.20.tgz",
"integrity": "sha512-y0fyKycxJHr82kxXKE50Vac5hPn5Kx3gw9CfqyEuwJ9VQzEixDljU+chrQK4Wods14jJn9Tt2ncNPGH1rLya3Q==", "integrity": "sha512-y0fyKycxJHr82kxXKE50Vac5hPn5Kx3gw9CfqyEuwJ9VQzEixDljU+chrQK4Wods14jJn9Tt2ncNPGH1rLya3Q==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"tslib": "^2.3.0" "tslib": "^2.3.0"
}, },
@@ -651,6 +662,7 @@
"integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@ampproject/remapping": "^2.2.0", "@ampproject/remapping": "^2.2.0",
"@babel/code-frame": "^7.26.2", "@babel/code-frame": "^7.26.2",
@@ -2507,6 +2519,7 @@
"resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.3.1.tgz", "resolved": "https://registry.npmjs.org/@capacitor/core/-/core-8.3.1.tgz",
"integrity": "sha512-UF8ItlHguU1Z6GXfPTeT2gakf+ctNI8pAS1kwSBQlsJMlfD4OPoto/SmKnOxKCQvnF4WRcdWeg6C0zREUNaAQg==", "integrity": "sha512-UF8ItlHguU1Z6GXfPTeT2gakf+ctNI8pAS1kwSBQlsJMlfD4OPoto/SmKnOxKCQvnF4WRcdWeg6C0zREUNaAQg==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
@@ -2520,6 +2533,15 @@
"@capacitor/core": "^8.3.0" "@capacitor/core": "^8.3.0"
} }
}, },
"node_modules/@capacitor/push-notifications": {
"version": "8.0.4",
"resolved": "https://registry.npmjs.org/@capacitor/push-notifications/-/push-notifications-8.0.4.tgz",
"integrity": "sha512-14ZWKik9ExTu65AZ9+o7+k05uEOaTstuYv6lLq1Bobip+SC5AOwciSICYLALgTTKN2jEDTRoigFAEixmVEJp/w==",
"license": "MIT",
"peerDependencies": {
"@capacitor/core": ">=8.0.0"
}
},
"node_modules/@discoveryjs/json-ext": { "node_modules/@discoveryjs/json-ext": {
"version": "0.6.3", "version": "0.6.3",
"resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz", "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.6.3.tgz",
@@ -3191,6 +3213,7 @@
"integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==", "integrity": "sha512-G1ytyOoHh5BphmEBxSwALin3n1KGNYB6yImbICcRQdzXfOGbuJ9Jske/Of5Sebk339NSGGNfUshnzK8YWkTPsQ==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@inquirer/checkbox": "^4.1.2", "@inquirer/checkbox": "^4.1.2",
"@inquirer/confirm": "^5.1.6", "@inquirer/confirm": "^5.1.6",
@@ -4485,6 +4508,40 @@
"node": ">=8" "node": ">=8"
} }
}, },
"node_modules/@microsoft/signalr": {
"version": "10.0.0",
"resolved": "https://registry.npmjs.org/@microsoft/signalr/-/signalr-10.0.0.tgz",
"integrity": "sha512-0BRqz/uCx3JdrOqiqgFhih/+hfTERaUfCZXFB52uMaZJrKaPRzHzMuqVsJC/V3pt7NozcNXGspjKiQEK+X7P2w==",
"license": "MIT",
"dependencies": {
"abort-controller": "^3.0.0",
"eventsource": "^2.0.2",
"fetch-cookie": "^2.0.3",
"node-fetch": "^2.6.7",
"ws": "^7.5.10"
}
},
"node_modules/@microsoft/signalr/node_modules/ws": {
"version": "7.5.10",
"resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz",
"integrity": "sha512-+dbF1tHwZpXcbOJdVOkzLDxZP1ailvSxM6ZweXTegylPny803bFhA+vqBYw4s31NSAk4S2Qz+AKXK9a4wkdjcQ==",
"license": "MIT",
"engines": {
"node": ">=8.3.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": "^5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
},
"node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": {
"version": "3.0.3", "version": "3.0.3",
"resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz",
@@ -4908,6 +4965,7 @@
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.17.tgz", "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-11.1.17.tgz",
"integrity": "sha512-hLODw5Abp8OQgA+mUO4tHou4krKgDtUcM9j5Ihxncst9XeyxYBTt2bwZm4e4EQr5E352S4Fyy6V3iFx9ggxKAg==", "integrity": "sha512-hLODw5Abp8OQgA+mUO4tHou4krKgDtUcM9j5Ihxncst9XeyxYBTt2bwZm4e4EQr5E352S4Fyy6V3iFx9ggxKAg==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"file-type": "21.3.2", "file-type": "21.3.2",
"iterare": "1.2.1", "iterare": "1.2.1",
@@ -6914,6 +6972,18 @@
"node": "^18.17.0 || >=20.5.0" "node": "^18.17.0 || >=20.5.0"
} }
}, },
"node_modules/abort-controller": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
"license": "MIT",
"dependencies": {
"event-target-shim": "^5.0.0"
},
"engines": {
"node": ">=6.5"
}
},
"node_modules/accepts": { "node_modules/accepts": {
"version": "1.3.8", "version": "1.3.8",
"resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
@@ -6944,6 +7014,7 @@
"integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"acorn": "bin/acorn" "acorn": "bin/acorn"
}, },
@@ -7007,6 +7078,7 @@
"resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz",
"integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"fast-deep-equal": "^3.1.3", "fast-deep-equal": "^3.1.3",
"fast-uri": "^3.0.1", "fast-uri": "^3.0.1",
@@ -7237,6 +7309,7 @@
"resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz", "resolved": "https://registry.npmjs.org/axios/-/axios-1.16.0.tgz",
"integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==", "integrity": "sha512-6hp5CwvTPlN2A31g5dxnwAX0orzM7pmCRDLnZSX772mv8WDqICwFjowHuPs04Mc8deIld1+ejhtaMn5vp6b+1w==",
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"follow-redirects": "^1.16.0", "follow-redirects": "^1.16.0",
"form-data": "^4.0.5", "form-data": "^4.0.5",
@@ -7562,6 +7635,7 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"baseline-browser-mapping": "^2.10.12", "baseline-browser-mapping": "^2.10.12",
"caniuse-lite": "^1.0.30001782", "caniuse-lite": "^1.0.30001782",
@@ -8745,29 +8819,6 @@
"node": ">= 0.8" "node": ">= 0.8"
} }
}, },
"node_modules/encoding": {
"version": "0.1.13",
"resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz",
"integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==",
"license": "MIT",
"optional": true,
"dependencies": {
"iconv-lite": "^0.6.2"
}
},
"node_modules/encoding/node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"license": "MIT",
"optional": true,
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/enhanced-resolve": { "node_modules/enhanced-resolve": {
"version": "5.20.1", "version": "5.20.1",
"resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz", "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.20.1.tgz",
@@ -9099,6 +9150,15 @@
"node": ">= 0.6" "node": ">= 0.6"
} }
}, },
"node_modules/event-target-shim": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/eventemitter3": { "node_modules/eventemitter3": {
"version": "4.0.7", "version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
@@ -9116,6 +9176,15 @@
"node": ">=0.8.x" "node": ">=0.8.x"
} }
}, },
"node_modules/eventsource": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/eventsource/-/eventsource-2.0.2.tgz",
"integrity": "sha512-IzUmBGPR3+oUG9dUeXynyNmf91/3zUSJg1lCktzKw47OXuhco54U3r9B7O4XX+Rb1Itm9OZ2b0RkTs10bICOxA==",
"license": "MIT",
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/exponential-backoff": { "node_modules/exponential-backoff": {
"version": "3.1.3", "version": "3.1.3",
"resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz", "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.3.tgz",
@@ -9296,6 +9365,16 @@
} }
} }
}, },
"node_modules/fetch-cookie": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/fetch-cookie/-/fetch-cookie-2.2.0.tgz",
"integrity": "sha512-h9AgfjURuCgA2+2ISl8GbavpUdR+WGAM2McW/ovn4tVccegp8ZqCKWSBR8uRdM8dDNlx5WdKRWxBYUwteLDCNQ==",
"license": "Unlicense",
"dependencies": {
"set-cookie-parser": "^2.4.8",
"tough-cookie": "^4.0.0"
}
},
"node_modules/figures": { "node_modules/figures": {
"version": "3.2.0", "version": "3.2.0",
"resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz",
@@ -10484,6 +10563,7 @@
"integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"bin": { "bin": {
"jiti": "bin/jiti.js" "jiti": "bin/jiti.js"
} }
@@ -10625,6 +10705,7 @@
"integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==", "integrity": "sha512-tkuLHQlvWUTeQ3doAqnHbNn8T6WX1KA8yvbKG9x4VtKtIjHsVKQZCH11zRgAfbDAXC2UNIg/K9BYAAcEzUIrNg==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"copy-anything": "^2.0.1", "copy-anything": "^2.0.1",
"parse-node-version": "^1.0.1", "parse-node-version": "^1.0.1",
@@ -12466,6 +12547,7 @@
} }
], ],
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"nanoid": "^3.3.8", "nanoid": "^3.3.8",
"picocolors": "^1.1.1", "picocolors": "^1.1.1",
@@ -12728,6 +12810,27 @@
"license": "MIT", "license": "MIT",
"optional": true "optional": true
}, },
"node_modules/psl": {
"version": "1.15.0",
"resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz",
"integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==",
"license": "MIT",
"dependencies": {
"punycode": "^2.3.1"
},
"funding": {
"url": "https://github.com/sponsors/lupomontero"
}
},
"node_modules/punycode": {
"version": "2.3.1",
"resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz",
"integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==",
"license": "MIT",
"engines": {
"node": ">=6"
}
},
"node_modules/qs": { "node_modules/qs": {
"version": "6.14.2", "version": "6.14.2",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz", "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
@@ -12744,6 +12847,12 @@
"url": "https://github.com/sponsors/ljharb" "url": "https://github.com/sponsors/ljharb"
} }
}, },
"node_modules/querystringify": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
"integrity": "sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==",
"license": "MIT"
},
"node_modules/queue-microtask": { "node_modules/queue-microtask": {
"version": "1.2.3", "version": "1.2.3",
"resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz",
@@ -12846,7 +12955,8 @@
"version": "0.2.2", "version": "0.2.2",
"resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz",
"integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==",
"license": "Apache-2.0" "license": "Apache-2.0",
"peer": true
}, },
"node_modules/regenerate": { "node_modules/regenerate": {
"version": "1.4.2", "version": "1.4.2",
@@ -12942,7 +13052,6 @@
"version": "1.0.0", "version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==", "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
"dev": true,
"license": "MIT" "license": "MIT"
}, },
"node_modules/resolve": { "node_modules/resolve": {
@@ -13263,6 +13372,7 @@
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz",
"integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==",
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"dependencies": { "dependencies": {
"tslib": "^2.1.0" "tslib": "^2.1.0"
} }
@@ -13583,6 +13693,12 @@
"node": ">= 0.8.0" "node": ">= 0.8.0"
} }
}, },
"node_modules/set-cookie-parser": {
"version": "2.7.2",
"resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.2.tgz",
"integrity": "sha512-oeM1lpU/UvhTxw+g3cIfxXHyJRc/uidd3yK1P242gzHds0udQBYzs3y8j4gCCW+ZJ7ad0yctld8RYO+bdurlvw==",
"license": "MIT"
},
"node_modules/setprototypeof": { "node_modules/setprototypeof": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
@@ -14315,6 +14431,7 @@
"integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==", "integrity": "sha512-LBAhFyLho16harJoWMg/nZsQYgTrg5jXOn2nCYjRUcZZEdE3qa2zb8QEDRUGVZBW4rlazf2fxkg8tztybTaqWw==",
"dev": true, "dev": true,
"license": "BSD-2-Clause", "license": "BSD-2-Clause",
"peer": true,
"dependencies": { "dependencies": {
"@jridgewell/source-map": "^0.3.3", "@jridgewell/source-map": "^0.3.3",
"acorn": "^8.8.2", "acorn": "^8.8.2",
@@ -14454,6 +14571,30 @@
"url": "https://github.com/sponsors/Borewit" "url": "https://github.com/sponsors/Borewit"
} }
}, },
"node_modules/tough-cookie": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz",
"integrity": "sha512-Loo5UUvLD9ScZ6jh8beX1T6sO1w2/MpCRpEP7V280GKMVUQ0Jzar2U3UJPsrdbziLEMMhu3Ujnq//rhiFuIeag==",
"license": "BSD-3-Clause",
"dependencies": {
"psl": "^1.1.33",
"punycode": "^2.1.1",
"universalify": "^0.2.0",
"url-parse": "^1.5.3"
},
"engines": {
"node": ">=6"
}
},
"node_modules/tough-cookie/node_modules/universalify": {
"version": "0.2.0",
"resolved": "https://registry.npmjs.org/universalify/-/universalify-0.2.0.tgz",
"integrity": "sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==",
"license": "MIT",
"engines": {
"node": ">= 4.0.0"
}
},
"node_modules/tr46": { "node_modules/tr46": {
"version": "0.0.3", "version": "0.0.3",
"resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
@@ -14490,7 +14631,8 @@
"version": "2.8.1", "version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD" "license": "0BSD",
"peer": true
}, },
"node_modules/tuf-js": { "node_modules/tuf-js": {
"version": "3.1.0", "version": "3.1.0",
@@ -14546,6 +14688,7 @@
"integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==",
"dev": true, "dev": true,
"license": "Apache-2.0", "license": "Apache-2.0",
"peer": true,
"bin": { "bin": {
"tsc": "bin/tsc", "tsc": "bin/tsc",
"tsserver": "bin/tsserver" "tsserver": "bin/tsserver"
@@ -14727,6 +14870,16 @@
"browserslist": ">= 4.21.0" "browserslist": ">= 4.21.0"
} }
}, },
"node_modules/url-parse": {
"version": "1.5.10",
"resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.5.10.tgz",
"integrity": "sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==",
"license": "MIT",
"dependencies": {
"querystringify": "^2.1.1",
"requires-port": "^1.0.0"
}
},
"node_modules/util-deprecate": { "node_modules/util-deprecate": {
"version": "1.0.2", "version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
@@ -14941,6 +15094,7 @@
"integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==", "integrity": "sha512-gX/dMkRQc7QOMzgTe6KsYFM7DxeIONQSui1s0n/0xht36HvrgbxtM1xBlgx596NbpHuQU8P7QpKwrZYwUX48nw==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@types/eslint-scope": "^3.7.7", "@types/eslint-scope": "^3.7.7",
"@types/estree": "^1.0.8", "@types/estree": "^1.0.8",
@@ -15020,6 +15174,7 @@
"integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==", "integrity": "sha512-QcQ72gh8a+7JO63TAx/6XZf/CWhgMzu5m0QirvPfGvptOusAxG12w2+aua1Jkjr7hzaWDnJ2n6JFeexMHI+Zjg==",
"dev": true, "dev": true,
"license": "MIT", "license": "MIT",
"peer": true,
"dependencies": { "dependencies": {
"@types/bonjour": "^3.5.13", "@types/bonjour": "^3.5.13",
"@types/connect-history-api-fallback": "^1.5.4", "@types/connect-history-api-fallback": "^1.5.4",
@@ -15615,7 +15770,8 @@
"version": "0.15.1", "version": "0.15.1",
"resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz", "resolved": "https://registry.npmjs.org/zone.js/-/zone.js-0.15.1.tgz",
"integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==", "integrity": "sha512-XE96n56IQpJM7NAoXswY3XRLcWFW83xe0BiAOeMD7K5k5xecOeul3Qcpx6GqEeeHNkW5DWL5zOyTbEfB4eti8w==",
"license": "MIT" "license": "MIT",
"peer": true
} }
} }
} }
+2
View File
@@ -21,7 +21,9 @@
"@capacitor/angular": "^2.0.3", "@capacitor/angular": "^2.0.3",
"@capacitor/core": "latest", "@capacitor/core": "latest",
"@capacitor/ios": "^8.3.0", "@capacitor/ios": "^8.3.0",
"@capacitor/push-notifications": "^8.0.4",
"@ionic/angular": "^8.8.3", "@ionic/angular": "^8.8.3",
"@microsoft/signalr": "^10.0.0",
"@openapitools/openapi-generator-cli": "^2.32.0", "@openapitools/openapi-generator-cli": "^2.32.0",
"rxjs": "~7.8.0", "rxjs": "~7.8.0",
"tslib": "^2.3.0", "tslib": "^2.3.0",
+7
View File
@@ -0,0 +1,7 @@
{
"/API": {
"target": "http://localhost:5250",
"secure": false,
"changeOrigin": true
}
}
+4 -1
View File
@@ -3,7 +3,10 @@ import { provideRouter } from '@angular/router';
import { routes } from './app.routes'; import { routes } from './app.routes';
import { provideIonicAngular } from '@ionic/angular/standalone'; import { provideIonicAngular } from '@ionic/angular/standalone';
import {provideHttpClient, withInterceptors} from "@angular/common/http";
import {authInterceptor} from "./core/auth/auth.interceptor";
export const appConfig: ApplicationConfig = { export const appConfig: ApplicationConfig = {
providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideIonicAngular({})] providers: [provideZoneChangeDetection({ eventCoalescing: true }), provideRouter(routes), provideIonicAngular({}),provideHttpClient(withInterceptors([authInterceptor])), provideHttpClient()],
}; };
+7 -12
View File
@@ -1,4 +1,5 @@
import { Routes } from '@angular/router'; import { Routes } from '@angular/router';
import {authGuard} from "./core/auth/auth.guard";
export const routes: Routes = [ export const routes: Routes = [
{ {
@@ -8,35 +9,29 @@ export const routes: Routes = [
}, },
{ {
path: 'main', path: 'main',
canActivate: [authGuard],
loadComponent: () => import('./pages/main/main.component').then(x => x.Main), loadComponent: () => import('./pages/main/main.component').then(x => x.Main),
children: [ children: [
/*{
path:'groupmessages',
loadComponent: () => import('./pages/groupmessages/groupmessages.component').then(x => x.Groupmessages)
},*/
{ {
path:'messages', path: 'messages/:discussionId',
loadComponent: () => import('./pages/messages/messages-main/messages-main.component').then(x => x.MessagesMain) loadComponent: () => import('./pages/messages/messages-main/messages-main.component').then(x => x.MessagesMain)
}, },
{ {
path:'menu', path: 'menu',
loadComponent: () => import('./pages/menu/menu/menu.component').then(x => x.Menu) loadComponent: () => import('./pages/menu/menu/menu.component').then(x => x.Menu)
}, },
{ {
path:'parameters', path: 'parameters',
loadComponent: () => import('./pages/parameters/parameters-main/parameters-main.component').then(x => x.ParametersMain) loadComponent: () => import('./pages/parameters/parameters-main/parameters-main.component').then(x => x.ParametersMain)
} }
] ]
}, },
{ {
path:'login', path: 'login',
loadComponent: () => import('./pages/login-form/login-form.component').then(x => x.LoginFormComponent) loadComponent: () => import('./pages/login-form/login-form.component').then(x => x.LoginFormComponent)
}, },
{ {
path:'register', path: 'register',
loadComponent: () => import('./pages/register-form/register-form.component').then(x => x.RegisterFormComponent) loadComponent: () => import('./pages/register-form/register-form.component').then(x => x.RegisterFormComponent)
}, },
]; ];
+13
View File
@@ -0,0 +1,13 @@
import { inject } from '@angular/core';
import { CanActivateFn, Router } from '@angular/router';
import {AuthService} from "./auth.service";
export const authGuard: CanActivateFn = () => {
const authService = inject(AuthService);
const router = inject(Router);
if (authService.isLoggedIn()) return true;
router.navigate(['/login']);
return false;
};
+15
View File
@@ -0,0 +1,15 @@
import { HttpInterceptorFn } from '@angular/common/http';
import { inject } from '@angular/core';
import {AuthService} from "./auth.service";
export const authInterceptor: HttpInterceptorFn = (req, next) => {
const token = inject(AuthService).getToken();
if (token) {
req = req.clone({
setHeaders: { Authorization: `Bearer ${token}` }
});
}
return next(req);
};
+110
View File
@@ -0,0 +1,110 @@
import { inject, Injectable, signal } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { Router } from '@angular/router';
import { firstValueFrom } from 'rxjs';
import { LoggedUser } from "../../models/user.model";
interface LoginResponse {
token: string;
id: number;
username: string;
email: string | null;
tel: string | null;
profilePicture: string | null;
description: string | null;
}
interface RegisterRequest {
username: string;
password: string;
}
@Injectable({ providedIn: 'root' })
export class AuthService {
private http = inject(HttpClient);
private router = inject(Router);
private readonly TOKEN_KEY = 'knots_token';
private readonly USER_KEY = 'knots_user';
currentUser = signal<LoggedUser | null>(this.loadUser());
private loadUser(): LoggedUser | null {
const raw = localStorage.getItem(this.USER_KEY);
return raw ? JSON.parse(raw) : null;
}
isLoggedIn(): boolean {
return !!localStorage.getItem(this.TOKEN_KEY);
}
getToken(): string | null {
return localStorage.getItem(this.TOKEN_KEY);
}
async login(username: string, password: string): Promise<void> {
const response = await firstValueFrom(
this.http.post<LoginResponse>('/API/users/login', { username, password })
);
localStorage.setItem(this.TOKEN_KEY, response.token);
const user: LoggedUser = {
id: String(response.id),
username: response.username,
email: response.email,
tel: response.tel,
profilePicture: response.profilePicture,
description: response.description,
};
localStorage.setItem(this.USER_KEY, JSON.stringify(user));
this.currentUser.set(user);
await this.router.navigate(['/main/menu']);
}
async register(
username: string,
password: string,
email: string,
tel: string,
description: string | null = null
): Promise<void> {
await firstValueFrom(
this.http.post<void>('/API/users', {
username,
password,
email,
tel,
description,
profilePicture: null
})
);
await this.router.navigate(['/login']);
}
logout(): void {
localStorage.removeItem(this.TOKEN_KEY);
localStorage.removeItem(this.USER_KEY);
this.currentUser.set(null);
this.router.navigate(['/login']);
}
updateCurrentUser(partial: Partial<LoggedUser>): void {
const user = this.currentUser();
if (!user) return;
const updated = { ...user, ...partial };
localStorage.setItem(this.USER_KEY, JSON.stringify(updated));
this.currentUser.set(updated);
}
getCurrentUserId(): number {
const user = this.currentUser();
if (!user) {
throw new Error('Aucun utilisateur connecté');
}
return Number(user.id);
}
}
+40
View File
@@ -0,0 +1,40 @@
import {inject, Injectable} from '@angular/core';
import { HubConnectionBuilder, HubConnectionState } from '@microsoft/signalr';
import * as signalR from '@microsoft/signalr';
import { AuthService } from "../auth/auth.service";
@Injectable({ providedIn: 'root' })
export class ChatService {
private authService = inject(AuthService);
private hub: signalR.HubConnection;
constructor() {
this.hub = new HubConnectionBuilder()
.withUrl('http://localhost:5250/hubs/chat', {
accessTokenFactory: () => this.authService.getToken() ?? ''
})
.withAutomaticReconnect()
.build();
}
async connect() {
if (this.hub.state === HubConnectionState.Disconnected) {
await this.hub.start();
}
}
async sendMessage(discussionId: string, content: string) {
await this.connect(); // s'assure que la connexion est active
await this.hub.invoke('SendMessage', discussionId, content);
}
onMessage(callback: (message: any) => void) {
this.hub.on('ReceiveMessage', callback);
}
async joinConversation(discussionId: string) {
await this.connect();
await this.hub.invoke('JoinConversation', discussionId);
}
}
+65
View File
@@ -0,0 +1,65 @@
import { Observable } from "rxjs";
import { HttpClient } from "@angular/common/http";
import { inject, Injectable } from "@angular/core";
export interface Message {
id: number;
contenu: string;
date: string;
userId: number;
authorName: string;
}
export interface MemberWithRole {
userId: number;
username: string;
roleId: number | null;
roleLibelle: string | null;
}
export interface Discussion {
id: number;
name: string;
isGroup: boolean;
membersCount?: number;
groupId?: number;
}
@Injectable({ providedIn: 'root' })
export class discussionsService {
private http = inject(HttpClient);
private apiUrl = 'http://localhost:5250/API';
getDiscussions(): Observable<Discussion[]> {
return this.http.get<Discussion[]>(`${this.apiUrl}/discussions/my`);
}
getMessages(discussionId: string): Observable<Message[]> {
return this.http.get<Message[]>(`${this.apiUrl}/discussions/${discussionId}/messages`);
}
createPrivateDiscussion(username: string): Observable<Discussion> {
return this.http.post<Discussion>(`${this.apiUrl}/discussions/private`, { username });
}
createGroupDiscussion(groupName: string, usernames: string[]): Observable<Discussion> {
return this.http.post<Discussion>(`${this.apiUrl}/discussions/group`, { groupName, usernames });
}
getDiscussionMembers(discussionId: string): Observable<string[]> {
return this.http.get<string[]>(`${this.apiUrl}/discussions/${discussionId}/members`);
}
getMembersWithRoles(discussionId: string): Observable<MemberWithRole[]> {
return this.http.get<MemberWithRole[]>(`${this.apiUrl}/discussions/${discussionId}/members/roles`);
}
createRole(libelle: string): Observable<{ id: number, libelle: string }> {
return this.http.post<{ id: number, libelle: string }>(`${this.apiUrl}/roles`, { libelle });
}
assignRole(groupId: number, userId: number, roleId: number): Observable<void> {
return this.http.post<void>(`${this.apiUrl}/groups/${groupId}/members/${userId}/role`, { roleId });
}
}
-41
View File
@@ -1,41 +0,0 @@
import { Injectable } from '@angular/core';
import {tap} from "rxjs";
@Injectable({
providedIn: 'root'
})
export class LoginService {
/*
login(credentials: { name: string; password: string }) {
return this.http.post<LoginResponse>(`${this.apiUrl}/login`, credentials).pipe(
tap(response => this.setSession(response.token))
);
}
*/
/*
refreshToken(): Observable<RefreshResponse> {
this.isRefreshing = true;
return this.http.post<RefreshResponse>(`${this.apiUrl}/refresh`, {})
.pipe(
tap(response => {
this.setSession(response.token);
}),
finalize(() => {
this.isRefreshing = false;
})
);
}
*/
/*
logout(){
return localStorage.removeItem('token');
this.currentUser.set(null);
this.router.navigate(['/login']);
}
*/
}
+8
View File
@@ -0,0 +1,8 @@
export interface LoggedUser {
id: string;
username: string;
email: string | null;
tel: string | null;
profilePicture: string | null;
description: string | null;
}
@@ -8,19 +8,19 @@
<h1>Knots</h1> <h1>Knots</h1>
<div class="card"> <div class="card" [formGroup]="loginForm">
<h3>Connectez-vous à Knots !</h3> <h3>Connectez-vous à Knots !</h3>
<ion-item lines="none" class="input"> <ion-item lines="none" class="input">
<ion-input placeholder="Login..."></ion-input> <ion-input formControlName="name" placeholder="Login..."></ion-input>
</ion-item> </ion-item>
<ion-item lines="none" class="input"> <ion-item lines="none" class="input">
<ion-input type="password" placeholder="Password..."></ion-input> <ion-input formControlName="password" type="password" placeholder="Password..."></ion-input>
</ion-item> </ion-item>
<ion-button expand="block" class="btn"> <ion-button expand="block" class="btn" (click)="submitForm()">
Se connecter Se connecter
</ion-button> </ion-button>
@@ -1,28 +1,23 @@
import {Component, inject} from '@angular/core'; import { Component, inject } from '@angular/core';
import { import {
IonButton, IonButton, IonContent, IonInput, IonItem, NavController,
IonCard,
IonCardContent,
IonCardHeader,
IonCardTitle, IonContent, IonInput, IonItem, NavController,
} from '@ionic/angular/standalone'; } from '@ionic/angular/standalone';
import {CommonModule} from "@angular/common"; import { CommonModule } from "@angular/common";
import {FormBuilder, ReactiveFormsModule, Validators} from "@angular/forms"; import { FormBuilder, ReactiveFormsModule, Validators } from "@angular/forms";
import {Router} from "@angular/router"; import { Router } from "@angular/router";
import {LoginService} from "../../login.service"; import { AuthService } from "../../core/auth/auth.service";
@Component({ @Component({
selector: 'login-form', selector: 'login-form',
templateUrl: 'login-form.component.html', templateUrl: 'login-form.component.html',
styleUrls: ['login-form.component.css'], styleUrls: ['login-form.component.css'],
imports: [IonButton, CommonModule, ReactiveFormsModule, IonItem, IonInput, IonContent,], imports: [IonButton, CommonModule, ReactiveFormsModule, IonItem, IonInput, IonContent],
}) })
export class LoginFormComponent { export class LoginFormComponent {
private fb = inject(FormBuilder); private fb = inject(FormBuilder);
private loginService = inject(LoginService); private authService = inject(AuthService);
private router = inject(Router); private router = inject(Router);
private navCtrl = inject(NavController);
isLoading = false; isLoading = false;
@@ -36,44 +31,35 @@ export class LoginFormComponent {
}); });
async submitForm(): Promise<void> { async submitForm(): Promise<void> {
console.log('submitForm appelé');
console.log('form valid:', this.loginForm.valid);
console.log('form values:', this.loginForm.value);
if (this.loginForm.valid) { if (this.loginForm.valid) {
await this.navCtrl.navigateRoot(['main/messages']);
this.isLoading = true; this.isLoading = true;
const request = { try {
name: this.loginForm.value.name!, await this.authService.login(
password: this.loginForm.value.password! this.loginForm.value.name!,
}; this.loginForm.value.password!
);
/*this.authService.login(request).subscribe({ } catch (err: any) {
next: () => { console.error('Erreur complète:', err);
this.isLoading = false;
this.notification.success('Succès', 'Connexion réussie !');
this.router.navigate(['/main/discussions']);
},
error: (err) => {
this.isLoading = false;
// Gestion des erreurs (inchangée)
if (err.status === 401) { if (err.status === 401) {
this.notification.error('Erreur', 'Identifiant ou mot de passe incorrect.'); console.error('Identifiant ou mot de passe incorrect.');
} else { } else {
this.notification.error('Erreur', 'Impossible de contacter le serveur.'); console.error('Impossible de contacter le serveur.');
} }
} finally {
this.isLoading = false;
} }
});
} else { } else {
// Affiche les erreurs de validation visuelles
Object.values(this.loginForm.controls).forEach(control => { Object.values(this.loginForm.controls).forEach(control => {
if (control.invalid) { if (control.invalid) {
control.markAsDirty(); control.markAsDirty();
control.updateValueAndValidity({ onlySelf: true }); control.updateValueAndValidity({ onlySelf: true });
} }
});*/ });
} }
} }
} }
@@ -19,3 +19,247 @@
box-shadow: 0 1px 5px rgba(180, 80, 80, 0.1); box-shadow: 0 1px 5px rgba(180, 80, 80, 0.1);
} }
} }
.modal-layout {
display: flex;
flex-direction: column;
height: 100%;
background: linear-gradient(160deg, #f9e8e8 0%, #f2c4c4 35%, #e89898 70%, #d97070 100%);
}
.modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 20px 12px;
border-bottom: 1px solid rgba(189, 90, 90, 0.15);
}
.modal-title {
font-size: 1.1rem;
font-weight: 700;
color: #7a2e2e;
margin: 0;
}
.modal-close-btn {
width: 34px;
height: 34px;
border-radius: 10px;
background: white;
border: none;
box-shadow: 0 2px 8px rgba(180, 80, 80, 0.12);
display: flex;
align-items: center;
justify-content: center;
color: #bd5a5a;
cursor: pointer;
font-size: 1.2rem;
transition: transform 0.15s;
&:active { transform: scale(0.92); }
}
.modal-body {
display: flex;
flex-direction: column;
gap: 20px;
padding: 24px 20px;
}
.input-wrapper {
display: flex;
flex-direction: column;
gap: 6px;
}
.custom-item {
--background: white;
--border-radius: 12px;
--padding-start: 14px;
--inner-padding-end: 14px;
--color: #7a2e2e;
--highlight-color-focused: #bd5a5a;
border-radius: 12px;
box-shadow: 0 2px 10px rgba(180, 80, 80, 0.1);
}
.error-msg {
color: #7a2e2e;
font-size: 0.8rem;
padding-left: 4px;
margin: 0;
}
.submit-btn {
background: white;
color: #bd5a5a;
border: none;
border-radius: 14px;
padding: 14px;
font-size: 0.95rem;
font-weight: 600;
box-shadow: 0 2px 10px rgba(180, 80, 80, 0.15);
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s;
&:active {
transform: scale(0.97);
box-shadow: 0 1px 5px rgba(180, 80, 80, 0.1);
}
}
.mode-switch {
margin-top: auto;
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px 16px;
background: rgba(255, 255, 255, 0.2);
border-radius: 16px;
backdrop-filter: blur(8px);
box-shadow: 0 2px 12px rgba(122, 46, 46, 0.08);
}
.switch-label {
color: #7a2e2e;
font-weight: 600;
font-size: 0.95rem;
}
/* SWITCH */
.switch {
position: relative;
width: 58px;
height: 32px;
}
.switch input {
display: none;
}
.slider {
position: absolute;
inset: 0;
cursor: pointer;
background: rgba(255, 255, 255, 0.6);
border-radius: 999px;
transition: all 0.25s ease;
box-shadow:
inset 0 1px 3px rgba(0,0,0,0.08),
0 2px 8px rgba(0,0,0,0.05);
}
.slider::before {
content: "";
position: absolute;
top: 4px;
left: 4px;
width: 24px;
height: 24px;
border-radius: 50%;
background: white;
transition: all 0.25s ease;
box-shadow:
0 2px 8px rgba(0,0,0,0.15);
}
.switch input:checked + .slider {
background: #bd5a5a;
}
.switch input:checked + .slider::before {
transform: translateX(26px);
}
.mode-switch:hover .slider {
transform: scale(1.03);
}
.add-member-btn {
display: flex;
align-items: center;
justify-content: center;
gap: 8px;
width: 100%;
padding: 12px 16px;
border: 2px dashed rgba(189, 90, 90, 0.35);
border-radius: 14px;
background: rgba(255, 255, 255, 0.55);
color: #bd5a5a;
font-size: 0.95rem;
font-weight: 600;
cursor: pointer;
transition: all 0.2s ease;
ion-icon {
font-size: 1.2rem;
}
&:hover {
background: rgba(255, 255, 255, 0.8);
border-color: #bd5a5a;
transform: translateY(-1px);
}
&:active {
transform: scale(0.98);
}
}
.remove-btn {
width: 26px;
height: 26px;
flex-shrink: 0;
display: flex;
align-items: center;
justify-content: center;
border: none;
border-radius: 50%;
background: white;
color: #bd5a5a;
cursor: pointer;
box-shadow: 0 2px 8px rgba(180, 80, 80, 0.12);
transition: all 0.2s ease;
ion-icon {
font-size: 1.1rem;
}
&:hover {
transform: translateY(-1px);
box-shadow: 0 4px 12px rgba(180, 80, 80, 0.18);
}
&:active {
transform: scale(0.92);
}
}
@@ -5,3 +5,97 @@
<path d="M56,48c2.209,0 4,1.791 4,4c0,2.209 -1.791,4 -4,4c-1.202,0 -38.798,0 -40,0c-2.209,0 -4,-1.791 -4,-4c0,-2.209 1.791,-4 4,-4c1.202,0 38.798,0 40,0zM56,32c2.209,0 4,1.791 4,4c0,2.209 -1.791,4 -4,4c-1.202,0 -38.798,0 -40,0c-2.209,0 -4,-1.791 -4,-4c0,-2.209 1.791,-4 4,-4c1.202,0 38.798,0 40,0zM56,16c2.209,0 4,1.791 4,4c0,2.209 -1.791,4 -4,4c-1.202,0 -38.798,0 -40,0c-2.209,0 -4,-1.791 -4,-4c0,-2.209 1.791,-4 4,-4c1.202,0 38.798,0 40,0z"></path></g></g> <path d="M56,48c2.209,0 4,1.791 4,4c0,2.209 -1.791,4 -4,4c-1.202,0 -38.798,0 -40,0c-2.209,0 -4,-1.791 -4,-4c0,-2.209 1.791,-4 4,-4c1.202,0 38.798,0 40,0zM56,32c2.209,0 4,1.791 4,4c0,2.209 -1.791,4 -4,4c-1.202,0 -38.798,0 -40,0c-2.209,0 -4,-1.791 -4,-4c0,-2.209 1.791,-4 4,-4c1.202,0 38.798,0 40,0zM56,16c2.209,0 4,1.791 4,4c0,2.209 -1.791,4 -4,4c-1.202,0 -38.798,0 -40,0c-2.209,0 -4,-1.791 -4,-4c0,-2.209 1.791,-4 4,-4c1.202,0 38.798,0 40,0z"></path></g></g>
</svg> </svg>
</button> </button>
<ion-modal [isOpen]="isModalOpen()" (didDismiss)="closeNav()">
<ng-template>
<div class="modal-layout">
<div class="modal-header">
<h2 class="modal-title">{{ isGroup() ? 'Nouveau groupe' : 'Nouvelle conversation' }}</h2>
<div class="header-actions">
<button class="modal-close-btn" (click)="closeNav()">
<ion-icon name="close-outline" />
</button>
</div>
</div>
<div class="modal-body">
<!-- Mode privé -->
<ng-container *ngIf="!isGroup()">
<div class="input-wrapper">
<ion-item class="custom-item">
<ion-input
[formControl]="username"
label="Nom d'utilisateur"
labelPlacement="floating"
placeholder="ex: jean_dupont"
/>
</ion-item>
<p class="error-msg" *ngIf="errorMsg()">{{ errorMsg() }}</p>
</div>
<button class="submit-btn" (click)="startConversation()" [disabled]="isLoading()">
{{ isLoading() ? 'Création...' : 'Démarrer la conversation' }}
</button>
</ng-container>
<!-- Mode groupe -->
<ng-container *ngIf="isGroup()">
<div class="input-wrapper">
<ion-item class="custom-item">
<ion-input
[formControl]="groupName"
label="Nom du groupe"
labelPlacement="floating"
placeholder="ex: Les amis"
/>
</ion-item>
</div>
<div class="members-list">
<div class="member-row" *ngFor="let ctrl of groupMembers; let i = index">
<ion-item class="custom-item member-item">
<ion-input
[formControl]="ctrl"
label="Membre {{ i + 1 }}"
labelPlacement="floating"
placeholder="ex: jean_dupont"
/>
</ion-item>
<button class="remove-btn" (click)="removeMember(i)" *ngIf="groupMembers.length > 1">
<ion-icon name="close-outline" />
</button>
</div>
</div>
<button class="add-member-btn" (click)="addMember()" *ngIf="groupMembers.length < 10">
<ion-icon name="add-outline" />
Ajouter un membre
</button>
<p class="error-msg" *ngIf="errorMsg()">{{ errorMsg() }}</p>
<button class="submit-btn" (click)="startGroupConversation()" [disabled]="isLoading()">
{{ isLoading() ? 'Création...' : 'Créer le groupe' }}
</button>
</ng-container>
<div class="mode-switch">
<span class="switch-label">
{{ isGroup() ? 'Mode groupe' : 'Conversation privée' }}
</span>
<label class="switch">
<input
type="checkbox"
[checked]="isGroup()"
(change)="toggleMode()"
>
<span class="slider"></span>
</label>
</div>
</div>
</div>
</ng-template>
</ion-modal>
@@ -1,16 +1,110 @@
import {Component, inject} from '@angular/core'; import { Component, inject, signal } from '@angular/core';
import {Router} from "@angular/router"; import { Router } from "@angular/router";
import { ReactiveFormsModule, FormControl } from "@angular/forms";
import { addIcons } from "ionicons";
import { IonIcon, IonInput, IonItem, IonModal } from "@ionic/angular/standalone";
import { closeOutline, addOutline } from "ionicons/icons";
import { discussionsService } from "../../../core/chat/discussion.service";
import {CommonModule} from "@angular/common";
@Component({ @Component({
selector: 'app-menu-nav', selector: 'app-menu-nav',
imports: [], imports: [IonModal, IonItem, IonInput, IonIcon, ReactiveFormsModule, CommonModule],
templateUrl: './menu-nav.component.html', templateUrl: './menu-nav.component.html',
styleUrl: './menu-nav.component.css' styleUrl: './menu-nav.component.css'
}) })
export class MenuNav { export class MenuNav {
private router = inject(Router)
openNav() { private router = inject(Router);
this.router.navigate(['/main/messages']); private discussionService = inject(discussionsService);
isModalOpen = signal(false);
isLoading = signal(false);
errorMsg = signal<string | null>(null);
isGroup = signal(false);
// Mode privé
username = new FormControl('');
// Mode groupe
groupName = new FormControl('');
groupMembers: FormControl[] = [new FormControl('')];
constructor() {
addIcons({ closeOutline, addOutline });
}
openNav() { this.isModalOpen.set(true); }
closeNav() {
this.isModalOpen.set(false);
this.username.reset();
this.groupName.reset();
this.groupMembers = [new FormControl('')];
this.errorMsg.set(null);
this.isGroup.set(false);
}
toggleMode() {
this.isGroup.update(v => !v);
this.errorMsg.set(null);
}
addMember() {
if (this.groupMembers.length < 10) {
this.groupMembers.push(new FormControl(''));
}
}
removeMember(index: number) {
this.groupMembers.splice(index, 1);
}
startConversation() {
const name = this.username.value?.trim();
if (!name || this.isLoading()) return;
this.isLoading.set(true);
this.errorMsg.set(null);
this.discussionService.createPrivateDiscussion(name).subscribe({
next: (discussion) => {
this.isLoading.set(false);
this.closeNav();
this.router.navigate(['/main/messages', discussion.id]);
},
error: (err) => {
this.isLoading.set(false);
this.errorMsg.set(
err.status === 404 ? 'Utilisateur introuvable.' : 'Une erreur est survenue.'
);
}
});
}
startGroupConversation() {
const name = this.groupName.value?.trim();
const usernames = this.groupMembers
.map(c => c.value?.trim())
.filter(v => !!v);
if (!name || usernames.length === 0 || this.isLoading()) return;
this.isLoading.set(true);
this.errorMsg.set(null);
this.discussionService.createGroupDiscussion(name, usernames).subscribe({
next: (discussion) => {
this.isLoading.set(false);
this.closeNav();
this.router.navigate(['/main/messages', discussion.id]);
},
error: (err) => {
this.isLoading.set(false);
this.errorMsg.set(
err.status === 404 ? 'Un ou plusieurs utilisateurs introuvables.' : 'Une erreur est survenue.'
);
}
});
} }
} }
@@ -0,0 +1,52 @@
@import url('https://fonts.googleapis.com/css2?family=Nunito:wght@400;600;700;800&display=swap');
.discussions-list {
display: flex;
flex-direction: column;
gap: 10px;
width: 100%;
}
.discussion-btn {
display: flex;
align-items: center;
gap: 14px;
width: 100%;
padding: 12px 16px;
background: rgba(255, 255, 255, 0.88);
border: none;
border-radius: 50px;
box-shadow: 0 2px 10px rgba(180, 80, 80, 0.10);
cursor: pointer;
transition: transform 0.15s, box-shadow 0.15s;
img {
opacity: 0.7;
flex-shrink: 0;
}
&:active {
transform: scale(0.97);
box-shadow: 0 1px 5px rgba(180, 80, 80, 0.08);
}
}
.discussion-info {
display: flex;
flex-direction: column;
align-items: flex-start;
}
.username {
font-family: 'Nunito', sans-serif;
font-size: 15px;
font-weight: 700;
color: #b05050;
}
.members {
font-family: 'Nunito', sans-serif;
font-size: 12px;
font-weight: 600;
color: #c98080;
}
@@ -0,0 +1,20 @@
<div class="discussions-list">
<button
class="discussion-btn"
*ngFor="let disc of discussions"
(click)="openDiscussion(disc.id)">
<img
width="36" height="36"
[src]="disc.isGroup
? 'https://img.icons8.com/ios/50/conference-call--v1.png'
: 'https://img.icons8.com/ios/50/user-male-circle--v1.png'"
alt="avatar"/>
<div class="discussion-info">
<span class="username">{{ disc.name }}</span>
<span class="members" *ngIf="disc.isGroup"> {{ disc.membersCount }} membres </span>
</div>
</button>
</div>
@@ -0,0 +1,36 @@
import {Component, inject, OnInit} from '@angular/core';
import { Router } from "@angular/router";
import { CommonModule } from "@angular/common";
import {discussionsService} from "../../../core/chat/discussion.service";
export interface Discussion {
id: number;
name: string;
isGroup: boolean;
membersCount?: number;
}
@Component({
selector: 'app-menu-users',
imports: [CommonModule],
templateUrl: './menu-users.component.html',
styleUrl: './menu-users.component.css'
})
export class MenuUsersComponent implements OnInit {
private router = inject(Router);
private discussionService = inject(discussionsService);
discussions: Discussion[] = [];
ngOnInit() {
this.discussionService.getDiscussions().subscribe({
next: (discussions) => this.discussions = discussions,
error: (err) => console.error('Impossible de charger les discussions', err)
});
}
openDiscussion(discussionId: number) {
this.router.navigate(['/main/messages', discussionId]);
}
}
@@ -3,4 +3,10 @@
<app-menu-nav/> <app-menu-nav/>
<app-menu-param/> <app-menu-param/>
</div> </div>
<div class="users">
<app-menu-users/>
</div>
</div> </div>
+30 -2
View File
@@ -1,16 +1,44 @@
import { Component } from '@angular/core'; import {Component, inject, signal} from '@angular/core';
import {MenuNav} from "../menu-nav/menu-nav.component"; import {MenuNav} from "../menu-nav/menu-nav.component";
import {MenuParamComponent} from "../menu-param/menu-param.component"; import {MenuParamComponent} from "../menu-param/menu-param.component";
import {MenuUsersComponent} from "../menu-users/menu-users.component";
import {KnotsDTOUserGetUserDto, UsersService} from "../../../services/api";
import {Router} from "@angular/router";
import {firstValueFrom} from "rxjs";
@Component({ @Component({
selector: 'app-menu', selector: 'app-menu',
imports: [ imports: [
MenuNav, MenuNav,
MenuParamComponent MenuParamComponent,
MenuUsersComponent
], ],
templateUrl: './menu.component.html', templateUrl: './menu.component.html',
styleUrl: './menu.component.css' styleUrl: './menu.component.css'
}) })
export class Menu { export class Menu {
private usersService = inject(UsersService);
router = inject(Router);
users = signal<KnotsDTOUserGetUserDto[]>([]);
usersLoading = signal<boolean>(false);
async ngOnInit() {
}
async fetchUsers() {
this.usersLoading.set(true);
try {
const users = await firstValueFrom(this.usersService.getAllUsersEndpoint());
this.users.set(users);
} catch (e) {
console.log('Erreur', 'Erreur de communication avec l\'API');
}
this.usersLoading.set(false);
}
} }
@@ -41,3 +41,215 @@
font-weight: 500; font-weight: 500;
color: #c07070; color: #c07070;
} }
ion-modal {
--background: transparent;
}
/* MODALE */
.modal-layout {
display: flex;
flex-direction: column;
height: 100%;
background: radial-gradient(
ellipse at top,
#fff 0%,
#f9ece9 45%,
#f3d4cc 100%
);
border-radius: 22px 22px 0 0;
box-shadow: 0 -12px 45px rgba(200, 120, 100, 0.25);
overflow: hidden;
}
/* HEADER */
.modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 18px;
background: rgba(255, 255, 255, 0.6);
backdrop-filter: blur(10px);
border-bottom: 1px solid rgba(192, 112, 112, 0.15);
}
.modal-title {
margin: 0;
font-size: 1.15rem;
font-weight: 700;
color: #c07070;
}
/* CLOSE */
.modal-close-btn {
width: 38px;
height: 38px;
border: none;
border-radius: 50%;
background: #fff;
color: #c07070;
display: flex;
align-items: center;
justify-content: center;
box-shadow: 0 3px 12px rgba(200, 120, 100, 0.15);
cursor: pointer;
transition: all 0.2s ease;
ion-icon {
font-size: 1.2rem;
}
&:hover {
transform: translateY(-1px);
box-shadow: 0 6px 18px rgba(200, 120, 100, 0.22);
}
&:active {
transform: scale(0.92);
}
}
/* BODY */
.modal-body {
display: flex;
flex-direction: column;
gap: 12px;
padding: 18px;
overflow-y: auto;
}
/* MEMBER CARD */
.member-card {
display: flex;
align-items: center;
justify-content: space-between;
padding: 14px;
background: rgba(255, 255, 255, 0.75);
border-radius: 16px;
box-shadow: 0 2px 12px rgba(200, 120, 100, 0.12);
transition: all 0.2s ease;
&:hover {
transform: translateY(-2px);
background: rgba(255, 255, 255, 0.92);
}
}
/* MEMBER INFO */
.member-info {
display: flex;
align-items: center;
gap: 12px;
}
.member-info img {
width: 38px;
height: 38px;
border-radius: 50%;
}
.member-text {
display: flex;
flex-direction: column;
gap: 2px;
}
.member-name {
font-size: 0.95rem;
font-weight: 600;
color: #7a3a3a;
}
.member-role {
font-size: 0.75rem;
color: rgba(122, 58, 58, 0.6);
}
/* ROLE ASSIGN */
.role-assign {
display: flex;
align-items: center;
gap: 6px;
}
/* INPUT */
.role-input {
width: 120px;
padding: 8px 10px;
border: 1px solid rgba(192, 112, 112, 0.25);
border-radius: 10px;
background: rgba(255, 255, 255, 0.8);
font-size: 0.85rem;
color: #7a3a3a;
outline: none;
transition: all 0.2s ease;
&:focus {
border-color: #c07070;
box-shadow: 0 0 0 3px rgba(192, 112, 112, 0.15);
}
}
/* BUTTON + */
.role-btn {
width: 34px;
height: 34px;
border: none;
border-radius: 10px;
background: #c07070;
color: white;
font-size: 18px;
font-weight: 600;
cursor: pointer;
box-shadow: 0 2px 10px rgba(192, 112, 112, 0.25);
transition: all 0.2s ease;
&:hover {
transform: translateY(-1px);
box-shadow: 0 6px 16px rgba(192, 112, 112, 0.35);
}
&:active {
transform: scale(0.92);
}
}
@@ -1,6 +1,40 @@
<button class="profile-btn"> <button class="profile-btn" (click)="openModal()">
<div class="icon-wrapper"> <div class="icon-wrapper">
<img width="50" height="50" src="https://img.icons8.com/ios/50/user-male-circle--v1.png" alt="user"/> <img width="50" height="50" src="https://img.icons8.com/ios/50/user-male-circle--v1.png" alt="user"/>
</div> </div>
<span class="username">Nom User</span> <span class="username">{{ name || 'Utilisateur' }}</span>
</button> </button>
<ion-modal [isOpen]="isModalOpen()" (didDismiss)="closeModal()">
<ng-template>
<div class="modal-layout">
<div class="modal-header">
<h2 class="modal-title">Membres</h2>
<button class="modal-close-btn" (click)="closeModal()">
<ion-icon name="close-outline"/>
</button>
</div>
<div class="modal-body">
<div class="member-card" *ngFor="let member of members()">
<div class="member-info">
<img width="36" height="36" src="https://img.icons8.com/ios/50/user-male-circle--v1.png" alt="user"/>
<div class="member-text">
<span class="member-name">{{ member.username }}</span>
<span class="member-role" *ngIf="member.roleLibelle">{{ member.roleLibelle }}</span>
</div>
</div>
<div class="role-assign" *ngIf="groupId">
<input
class="role-input"
[(ngModel)]="newRoleInput[member.userId]"
placeholder="Nouveau rôle..."
/>
<button class="role-btn" (click)="assignRole(member.userId)">+</button>
</div>
</div>
</div>
</div>
</ng-template>
</ion-modal>
@@ -1,11 +1,63 @@
import { Component } from '@angular/core'; import { Component, Input, inject, signal } from '@angular/core';
import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms';
import { IonModal, IonIcon } from '@ionic/angular/standalone';
import { addIcons } from 'ionicons';
import { closeOutline } from 'ionicons/icons';
import { discussionsService, MemberWithRole } from '../../../core/chat/discussion.service';
import { ActivatedRoute } from '@angular/router';
@Component({ @Component({
selector: 'app-messages-infouser', selector: 'app-messages-infouser',
imports: [], imports: [CommonModule, IonModal, IonIcon, FormsModule],
templateUrl: './messages-infouser.component.html', templateUrl: './messages-infouser.component.html',
styleUrl: './messages-infouser.component.css' styleUrl: './messages-infouser.component.css'
}) })
export class MessagesInfoUser { export class MessagesInfoUser {
@Input() name: string = '';
@Input() groupId: number | null = null;
private discussionService = inject(discussionsService);
private route = inject(ActivatedRoute);
isModalOpen = signal(false);
members = signal<MemberWithRole[]>([]);
newRoleInput: { [userId: number]: string } = {};
constructor() {
addIcons({ closeOutline });
}
openModal() {
const discussionId = this.route.snapshot.paramMap.get('discussionId')!;
this.discussionService.getMembersWithRoles(discussionId).subscribe({
next: (members) => {
this.members.set(members);
this.isModalOpen.set(true);
}
});
}
closeModal() { this.isModalOpen.set(false); }
assignRole(userId: number) {
const libelle = this.newRoleInput[userId]?.trim();
if (!libelle || !this.groupId) return;
this.discussionService.createRole(libelle).subscribe({
next: (role) => {
this.discussionService.assignRole(this.groupId!, userId, role.id).subscribe({
next: () => {
this.members.update(members =>
members.map(m => m.userId === userId
? { ...m, roleId: role.id, roleLibelle: libelle }
: m
)
);
this.newRoleInput[userId] = '';
}
});
}
});
}
} }
@@ -2,22 +2,21 @@
<div class="header"> <div class="header">
<app-messages-menu/> <app-messages-menu/>
<app-messages-infouser/> <app-messages-infouser [name]="discussionName" [groupId]="groupId"/>
</div> </div>
<div class="messages"> <div class="messages">
<div class="message received"> <div *ngFor="let message of messages"
<p>Salut, comment tu vas ?</p> class="message"
<span class="timestamp">15:33, Hier.</span> [class.sent]="isSent(message)"
</div> [class.received]="!isSent(message)">
<div class="message sent"> <p>{{ message.contenu }}</p>
<p>ça va</p> <span class="timestamp">{{ message.date | date:'HH:mm' }}</span>
<span class="timestamp">11:25, Aujd.</span>
</div> </div>
</div> </div>
<div class="bottombar"> <div class="bottombar">
<app-messages-send/> <app-messages-send [discussionId]="currentDiscussionId" />
</div> </div>
</div> </div>
@@ -1,19 +1,62 @@
import { Component } from '@angular/core'; import { Component, inject, OnInit } from '@angular/core';
import {MessagesMenu} from "../messages-menu/messages-menu.component"; import { CommonModule } from '@angular/common';
import {MessagesInfoUser} from "../messages-infouser/messages-infouser.component"; import { MessagesMenu } from "../messages-menu/messages-menu.component";
import {MessagesSend} from "../messages-send/messages-send.component"; import { MessagesInfoUser } from "../messages-infouser/messages-infouser.component";
import {Router} from '@angular/router'; import { MessagesSend } from "../messages-send/messages-send.component";
import { ActivatedRoute } from '@angular/router';
import { discussionsService, Message } from "../../../core/chat/discussion.service";
import { AuthService } from "../../../core/auth/auth.service";
import {ChatService} from "../../../core/chat/chat.service";
@Component({ @Component({
selector: 'app-messages-main', selector: 'app-messages-main',
imports: [ imports: [CommonModule, MessagesMenu, MessagesInfoUser, MessagesSend],
MessagesMenu,
MessagesInfoUser,
MessagesSend
],
templateUrl: './messages-main.component.html', templateUrl: './messages-main.component.html',
styleUrl: './messages-main.component.css' styleUrl: './messages-main.component.css'
}) })
export class MessagesMain { export class MessagesMain implements OnInit {
private route = inject(ActivatedRoute);
private discussionService = inject(discussionsService);
private authService = inject(AuthService);
private chatService = inject(ChatService);
currentDiscussionId!: string;
currentUserId!: number;
messages: Message[] = [];
discussionName: string = '';
groupId: number | null = null;
async ngOnInit() {
this.currentDiscussionId = this.route.snapshot.paramMap.get('discussionId')!;
this.currentUserId = this.authService.getCurrentUserId();
this.discussionService.getDiscussions().subscribe({
next: (discussions) => {
const discussion = discussions.find(d => d.id === +this.currentDiscussionId);
console.log('discussion:', discussion);
this.discussionName = discussion?.name ?? '';
this.groupId = discussion?.groupId ?? null;
console.log('groupId:', this.groupId);
}
});
this.discussionService.getMessages(this.currentDiscussionId).subscribe({
next: (messages) => this.messages = messages,
error: (err) => console.error('Impossible de charger les messages', err)
});
// réception temps réel
this.chatService.onMessage((message: Message) => {
this.messages = [...this.messages, message];
});
// rejoindre la room pour ne recevoir que cette conversation
await this.chatService.connect();
await this.chatService.joinConversation(this.currentDiscussionId);
}
isSent(message: Message): boolean {
return message.userId === this.currentUserId;
}
} }
@@ -1,27 +1,37 @@
import { Component } from '@angular/core'; import { Component, inject, Input } from '@angular/core';
import {FormControl, FormsModule, ReactiveFormsModule} from "@angular/forms"; import { FormControl, FormsModule, ReactiveFormsModule } from "@angular/forms";
import { ChatService } from "../../../core/chat/chat.service";
@Component({ @Component({
selector: 'app-messages-send', selector: 'app-messages-send',
imports: [ imports: [FormsModule, ReactiveFormsModule],
FormsModule, templateUrl: './messages-send.component.html',
ReactiveFormsModule
],
templateUrl:'./messages-send.component.html',
styleUrl: './messages-send.component.css' styleUrl: './messages-send.component.css'
}) })
export class MessagesSend { export class MessagesSend {
sendMessage = new FormControl();
onSubmit() { private chatService = inject(ChatService);
@Input() discussionId!: string;
sendMessage = new FormControl();
isSending = false;
async onSubmit() {
const message = this.sendMessage.value; const message = this.sendMessage.value;
if (!message || message.trim() === '') return; if (!message || message.trim() === '') return;
if (this.isSending) return;
console.log('Message envoyé :', message); this.isSending = true;
// Logique d'envoi
try {
await this.chatService.sendMessage(this.discussionId, message.trim());
this.sendMessage.reset(); this.sendMessage.reset();
} catch (error) {
console.error('Erreur lors de l\'envoi :', error);
} finally {
this.isSending = false;
}
} }
} }
@@ -0,0 +1,21 @@
.logout-btn {
align-self: flex-start;
width: 44px;
height: 44px;
border-radius: 14px;
background: white;
border: none;
box-shadow: 0 2px 10px rgba(180, 80, 80, 0.12);
display: flex;
align-items: center;
justify-content: center;
color: rosybrown;
cursor: pointer;
margin-bottom: 28px;
transition: box-shadow 0.2s, transform 0.15s;
&:active {
transform: scale(0.94);
box-shadow: 0 1px 5px rgba(180, 80, 80, 0.1);
}
}
@@ -0,0 +1,7 @@
<button class="logout-btn" (click)="logout()">
<svg width="20" height="20" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
<polyline points="16 17 21 12 16 7" stroke="currentColor" stroke-width="1.8" stroke-linecap="round" stroke-linejoin="round"/>
<line x1="21" y1="12" x2="9" y2="12" stroke="currentColor" stroke-width="1.8" stroke-linecap="round"/>
</svg>
</button>
@@ -0,0 +1,16 @@
import {Component, inject} from '@angular/core';
import {AuthService} from "../../../core/auth/auth.service";
@Component({
selector: 'app-disconnect',
imports: [],
templateUrl: './disconnect.component.html',
styleUrl: './disconnect.component.css'
})
export class DisconnectComponent {
private authService = inject(AuthService);
logout() {
this.authService.logout();
}
}
@@ -0,0 +1,105 @@
.modal-layout {
display: flex;
flex-direction: column;
height: 100%;
background: linear-gradient(160deg, #f9e8e8 0%, #f2c4c4 35%, #e89898 70%, #d97070 100%);
}
.modal-header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 20px 20px 12px;
border-bottom: 1px solid rgba(189, 90, 90, 0.15);
}
.modal-title {
font-size: 1.1rem;
font-weight: 700;
color: #7a2e2e;
margin: 0;
}
.modal-close-btn {
width: 34px;
height: 34px;
border-radius: 10px;
background: white;
border: none;
box-shadow: 0 2px 8px rgba(180, 80, 80, 0.12);
display: flex;
align-items: center;
justify-content: center;
color: #bd5a5a;
cursor: pointer;
font-size: 1.2rem;
transition: transform 0.15s;
&:active { transform: scale(0.92); }
}
.modal-body {
display: flex;
flex-direction: column;
gap: 20px;
padding: 24px 20px;
}
.input-wrapper {
display: flex;
flex-direction: column;
gap: 6px;
padding-bottom: 10px;
}
.custom-item {
--background: white;
--border-radius: 12px;
--padding-start: 14px;
--inner-padding-end: 14px;
--color: #7a2e2e;
--highlight-color-focused: #bd5a5a;
border-radius: 12px;
box-shadow: 0 2px 10px rgba(180, 80, 80, 0.1);
&.invalid {
--border-color: #d97070;
box-shadow: 0 2px 10px rgba(180, 80, 80, 0.25);
}
}
.error-msg {
color: #7a2e2e;
font-size: 0.8rem;
padding-left: 4px;
margin: 0;
}
.submit-btn {
width: 100%;
background: white;
color: #bd5a5a;
border: none;
border-radius: 14px;
padding: 14px;
font-size: 0.95rem;
font-weight: 600;
box-shadow: 0 2px 10px rgba(180, 80, 80, 0.15);
cursor: pointer;
transition: transform 0.15s, box-shadow 0.2s;
&:active {
transform: scale(0.97);
box-shadow: 0 1px 5px rgba(180, 80, 80, 0.1);
}
&:disabled {
opacity: 0.5;
cursor: not-allowed;
}
}
:host {
display: block;
height: 100%;
}
@@ -0,0 +1,54 @@
<div class="modal-layout">
<div class="modal-header">
<h2 class="modal-title">Modifier les coordonnées</h2>
<button class="modal-close-btn" (click)="close.emit()">
<ion-icon name="close-outline" />
</button>
</div>
<div class="modal-body">
<form [formGroup]="coordinatesForm" (ngSubmit)="submitForm()">
<div class="input-wrapper">
<ion-item class="custom-item" [class.invalid]="email.invalid && email.touched">
<ion-input
label="Email"
labelPlacement="floating"
type="email"
formControlName="email"
placeholder="exemple@email.com"
/>
</ion-item>
@if (email.invalid && email.touched) {
<p class="error-msg">Adresse email invalide</p>
}
</div>
<div class="input-wrapper">
<ion-item class="custom-item" [class.invalid]="tel.invalid && tel.touched">
<ion-input
label="Téléphone"
labelPlacement="floating"
type="tel"
formControlName="tel"
placeholder="0612345678"
/>
</ion-item>
@if (tel.invalid && tel.touched) {
<p class="error-msg">Numéro à 10 chiffres requis</p>
}
</div>
<button
class="submit-btn"
type="submit"
[disabled]="coordinatesForm.invalid || loading()"
>
{{ loading() ? 'Enregistrement...' : 'Valider' }}
</button>
</form>
</div>
</div>
@@ -0,0 +1,76 @@
import {Component, EventEmitter, inject, Output, signal} from '@angular/core';
import { addIcons } from 'ionicons';
import { closeOutline } from 'ionicons/icons';
import {
IonButton,
IonButtons,
IonContent,
IonHeader,
IonIcon, IonInput,
IonItem, IonNote,
IonTitle,
IonToolbar
} from "@ionic/angular/standalone";
import {FormControl, FormGroup, ReactiveFormsModule, Validators} from "@angular/forms";
import {firstValueFrom} from "rxjs";
import {KnotsDTOUserUpdateUserContactDto, UsersService} from "../../../services/api";
import {AuthService} from "../../../core/auth/auth.service";
@Component({
selector: 'app-parameters-coordinates-form',
imports: [IonIcon,ReactiveFormsModule, IonItem, IonInput],
templateUrl: './parameters-coordinates-form.component.html',
styleUrl: './parameters-coordinates-form.component.css'
})
export class ParametersCoordinatesFormComponent {
@Output() close = new EventEmitter<void>();
private userService = inject(UsersService);
private authService = inject(AuthService);
loading = signal(false);
coordinatesForm = new FormGroup({
email: new FormControl<string>(null, [Validators.required, Validators.email]),
tel: new FormControl<string>(null, [Validators.required, Validators.pattern(/^\d{10}$/)]),
});
constructor() {
addIcons({ closeOutline });
}
ngOnInit() {
const user = this.authService.currentUser();
this.coordinatesForm.patchValue({
email: user?.email ?? null,
tel: user?.tel ?? null,
});
}
get email() { return this.coordinatesForm.get('email')!; }
get tel() { return this.coordinatesForm.get('tel')!; }
async submitForm() {
if (this.coordinatesForm.invalid) return;
this.loading.set(true);
const user = this.authService.currentUser();
if (!user) return;
const userValue: KnotsDTOUserUpdateUserContactDto = {
email: this.coordinatesForm.value.email,
tel: this.coordinatesForm.value.tel,
};
try {
await firstValueFrom(this.userService.patchUserContactEndpoint(Number(user.id), userValue));
this.coordinatesForm.reset();
this.close.emit();
} catch (e) {
console.error('Erreur lors de la mise à jour des coordonnées', e);
}
this.loading.set(false);
}
}
@@ -6,7 +6,7 @@
border: 1.5px solid rgba(201, 112, 112, 0.25); border: 1.5px solid rgba(201, 112, 112, 0.25);
cursor: pointer; cursor: pointer;
border-radius: 50px; border-radius: 50px;
background: #fce8e8; background: #fff8f8;
box-shadow: box-shadow:
0 8px 32px rgba(180, 80, 80, 0.12), 0 8px 32px rgba(180, 80, 80, 0.12),
0 2px 8px rgba(180, 80, 80, 0.08); 0 2px 8px rgba(180, 80, 80, 0.08);
@@ -15,20 +15,22 @@
} }
.coordinates-btn:hover { .coordinates-btn:hover {
background: #ffebeb; background: #fff3f3;
box-shadow: 0 6px 28px rgba(180, 80, 80, 0.18); box-shadow: 0 6px 28px rgba(180, 80, 80, 0.18);
transform: translateY(-1px); transform: translateY(-1px);
} }
.coordinates-btn:active { .coordinates-btn:active {
transform: translateY(0); transform: translateY(1px) scale(0.985);
background: #ffe8e8;
box-shadow: 0 2px 8px rgba(180, 80, 80, 0.10);
} }
.coordinates-btn .icon-wrapper { .coordinates-btn .icon-wrapper {
width: 40px; width: 40px;
height: 40px; height: 40px;
border-radius: 50%; border-radius: 50%;
background-color: #f4cece; background-color: #f8e2e2;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
@@ -1,4 +1,4 @@
<button class="coordinates-btn"> <button class="coordinates-btn" (click)="openModal()">
<svg width="35" height="35" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg"> <svg width="35" height="35" viewBox="0 0 512 512" xmlns="http://www.w3.org/2000/svg">
<path d="M256 48c-114.9 0-208 93.1-208 208s93.1 208 208 208c42.6 0 81.8-12.8 114.4-34.7 6.6-4.5 8.3-13.5 3.8-20.1-4.5-6.6-13.5-8.3-20.1-3.8C325.9 420.6 292.2 432 256 432c-97 0-176-79-176-176S159 80 256 80s176 79 176 176v40c0 22.1-17.9 40-40 40s-40-17.9-40-40v-40c0-53-43-96-96-96s-96 43-96 96 43 96 96 96c22.1 0 42.4-7.5 58.6-20.1C328.7 354.2 358.1 368 392 368c39.7 0 72-32.3 72-72v-40c0-114.9-93.1-208-208-208zm0 272c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z" fill="#BD5A5A" fill-opacity="0.8" <path d="M256 48c-114.9 0-208 93.1-208 208s93.1 208 208 208c42.6 0 81.8-12.8 114.4-34.7 6.6-4.5 8.3-13.5 3.8-20.1-4.5-6.6-13.5-8.3-20.1-3.8C325.9 420.6 292.2 432 256 432c-97 0-176-79-176-176S159 80 256 80s176 79 176 176v40c0 22.1-17.9 40-40 40s-40-17.9-40-40v-40c0-53-43-96-96-96s-96 43-96 96 43 96 96 96c22.1 0 42.4-7.5 58.6-20.1C328.7 354.2 358.1 368 392 368c39.7 0 72-32.3 72-72v-40c0-114.9-93.1-208-208-208zm0 272c-35.3 0-64-28.7-64-64s28.7-64 64-64 64 28.7 64 64-28.7 64-64 64z" fill="#BD5A5A" fill-opacity="0.8"
stroke="#BD5A5A" stroke="#BD5A5A"
@@ -9,3 +9,9 @@
</svg> </svg>
<span class="username">Modifier les coordonnées</span> <span class="username">Modifier les coordonnées</span>
</button> </button>
<ion-modal [isOpen]="isModalOpen" (didDismiss)="closeModal()">
<ng-template>
<app-parameters-coordinates-form (close)="closeModal()" />
</ng-template>
</ion-modal>
@@ -1,43 +1,19 @@
import {Component, EventEmitter, Input, Output} from '@angular/core'; import {Component, ViewEncapsulation} from '@angular/core';
import { IonModal, IonButton } from '@ionic/angular/standalone';
import {FormsModule} from "@angular/forms"; import {FormsModule} from "@angular/forms";
import {ParametersCoordinatesFormComponent} from "../parameters-coordinates-form/parameters-coordinates-form.component";
export interface Coordonnees {
phone: string;
email: string;
}
@Component({ @Component({
selector: 'app-parameters-coordinates', selector: 'app-parameters-coordinates',
imports: [ encapsulation: ViewEncapsulation.None,
FormsModule imports: [IonModal, FormsModule, ParametersCoordinatesFormComponent],
],
templateUrl: './parameters-coordinates.component.html', templateUrl: './parameters-coordinates.component.html',
styleUrl: './parameters-coordinates.component.css' styleUrl: './parameters-coordinates.component.css'
}) })
export class ParametersCoordinatesComponent { export class ParametersCoordinatesComponent {
@Input() isOpen: boolean = false; isModalOpen = false;
@Output() closed = new EventEmitter<void>();
@Output() saved = new EventEmitter<Coordonnees>();
form: Coordonnees = { phone: '', email: '' }; openModal() { this.isModalOpen = true; }
phoneFocused = false; closeModal() { this.isModalOpen = false; }
emailFocused = false;
close(): void {
this.closed.emit();
}
save(): void {
if (this.form.phone || this.form.email) {
this.saved.emit({ ...this.form });
this.close();
}
}
onOverlayClick(event: MouseEvent): void {
if ((event.target as HTMLElement).classList.contains('modal-overlay')) {
this.close();
}
}
} }
@@ -12,3 +12,10 @@
padding: 16px; padding: 16px;
gap: 12px; gap: 12px;
} }
.header {
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
}
@@ -1,5 +1,9 @@
<div class="page-param" > <div class="page-param" >
<div class="header">
<app-parameters-exit/> <app-parameters-exit/>
<app-disconnect/>
</div>
<div> <div>
<app-parameters-coordinates/> <app-parameters-coordinates/>
@@ -1,18 +1,21 @@
import { Component } from '@angular/core'; import { Component } from '@angular/core';
import {ParametersExit} from "../parameters-exit/parameters-exit.component"; import {ParametersExit} from "../parameters-exit/parameters-exit.component";
import {DisconnectComponent} from "../disconnect/disconnect.component";
import {ParametersCoordinatesComponent} from "../parameters-coordinates/parameters-coordinates.component"; import {ParametersCoordinatesComponent} from "../parameters-coordinates/parameters-coordinates.component";
import {ParametersProfileComponent} from "../parameters-profile/parameters-profile.component"; import {ParametersProfileComponent} from "../parameters-profile/parameters-profile.component";
@Component({ @Component({
selector: 'app-parameters-main', selector: 'app-parameters-main',
templateUrl: './parameters-main.component.html',
imports: [ imports: [
ParametersExit, ParametersExit,
DisconnectComponent,
ParametersCoordinatesComponent, ParametersCoordinatesComponent,
ParametersProfileComponent ParametersProfileComponent
], ],
templateUrl: './parameters-main.component.html',
styleUrl: './parameters-main.component.css' styleUrl: './parameters-main.component.css'
}) })
export class ParametersMain { export class ParametersMain {
} }
@@ -247,4 +247,10 @@
opacity: 1; opacity: 1;
transform: scale(1.15); transform: scale(1.15);
} }
.field-error {
color: var(--ion-color-danger, #eb445a);
font-size: 0.75rem;
padding: 2px 0 0 4px;
}
} }
@@ -34,35 +34,46 @@
/> />
</ng-template> </ng-template>
<button class="edit-btn" (click)="toggleEditUsername()" title="Modifier"> <button class="edit-btn" (click)="toggleEditUsername()" title="Modifier">
<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg *ngIf="!editingUsername()" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.5 3.5L16.5 6.5L7 16H4V13L13.5 3.5Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/> <path d="M13.5 3.5L16.5 6.5L7 16H4V13L13.5 3.5Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
<path d="M11.5 5.5L14.5 8.5" stroke="currentColor" stroke-width="1.6"/> <path d="M11.5 5.5L14.5 8.5" stroke="currentColor" stroke-width="1.6"/>
</svg> </svg>
<svg *ngIf="editingUsername()" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 10L8 14L16 6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button> </button>
</div> </div>
<!-- Sous la div.field du username -->
<span class="field-error" *ngIf="usernameError()">{{ usernameError() }}</span>
<!-- Bio field --> <!-- Bio field -->
<div class="field bio-field"> <div class="field bio-field">
<ng-container *ngIf="!editingBio(); else editBioBlock"> <ng-container *ngIf="!editingBio(); else editBioBlock">
<span class="field-value bio-value">{{ bio() }}</span> <span class="field-value bio-value">{{ bio() }}</span>
</ng-container> </ng-container>
<ng-template #editBioBlock> <ng-template #editBioBlock>
<textarea <input
class="field-input bio-textarea" class="field-input"
[value]="bio()" [(ngModel)]="bio"
(input)="bio.set($any($event.target).value)" [ngModel]="bio()"
(ngModelChange)="bio.set($event)"
(blur)="toggleEditBio()" (blur)="toggleEditBio()"
(keydown.enter)="toggleEditBio()"
autofocus autofocus
></textarea> />
</ng-template> </ng-template>
<textarea class="field-input bio-textarea" [value]="bio()" (input)="bio.set($any($event.target).value)" (blur)="toggleEditBio()" autofocus></textarea>
<button class="edit-btn" (click)="toggleEditBio()" title="Modifier"> <button class="edit-btn" (click)="toggleEditBio()" title="Modifier">
<svg viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg"> <svg *ngIf="!editingBio()" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M13.5 3.5L16.5 6.5L7 16H4V13L13.5 3.5Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/> <path d="M13.5 3.5L16.5 6.5L7 16H4V13L13.5 3.5Z" stroke="currentColor" stroke-width="1.6" stroke-linejoin="round"/>
<path d="M11.5 5.5L14.5 8.5" stroke="currentColor" stroke-width="1.6"/> <path d="M11.5 5.5L14.5 8.5" stroke="currentColor" stroke-width="1.6"/>
</svg> </svg>
<svg *ngIf="editingBio()" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M4 10L8 14L16 6" stroke="currentColor" stroke-width="1.6" stroke-linecap="round" stroke-linejoin="round"/>
</svg>
</button> </button>
</div> </div>
</div> </div>
</div> </div>
@@ -1,45 +1,143 @@
import {Component, signal} from '@angular/core'; import {Component, inject, OnInit, signal} from '@angular/core';
import { CommonModule } from '@angular/common'; import { CommonModule } from '@angular/common';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
import {firstValueFrom} from "rxjs";
import {UsersService} from "../../../services/api";
import {AuthService} from "../../../core/auth/auth.service";
@Component({ @Component({
selector: 'app-parameters-profile', selector: 'app-parameters-profile',
imports: [FormsModule, CommonModule], imports: [FormsModule, CommonModule],
templateUrl: './parameters-profile.component.html', templateUrl: './parameters-profile.component.html',
standalone: true,
styleUrl: './parameters-profile.component.css' styleUrl: './parameters-profile.component.css'
}) })
export class ParametersProfileComponent { export class ParametersProfileComponent implements OnInit {
username = signal('Doggeybag'); private usersService = inject(UsersService);
bio = signal('Joueur Valorant'); private authService = inject(AuthService);
profileImage = signal<string>(null);
username = signal<string>(null);
bio = signal<string>(null);
editingUsername = signal(false); editingUsername = signal(false);
editingBio = signal(false); editingBio = signal(false);
profileImage = signal<string | null>(null); usernameError = signal<string>(null);
loading = signal(false);
ngOnInit() {
const user = this.authService.currentUser();
this.profileImage.set(user?.profilePicture ?? null);
this.username.set(user?.username ?? null);
this.bio.set(user?.description ?? null);
}
// --- Username ---
toggleEditUsername() {
if (this.editingUsername()) {
this.submitUsername();
} else {
this.usernameError.set(null);
this.editingUsername.set(true);
}
}
async submitUsername() {
const value = this.username()?.trim();
if (!value) {
this.usernameError.set('Le pseudo ne peut pas être vide.');
return;
}
if (value === this.authService.currentUser()?.username) {
this.editingUsername.set(false);
return;
}
this.loading.set(true);
const user = this.authService.currentUser();
if (!user) return;
try {
await firstValueFrom(this.usersService.patchUsernameEndpoint(
String(user.id), { username: value }
));
this.authService.updateCurrentUser({ username: value }); // 👈 maj locale
this.usernameError.set(null);
this.editingUsername.set(false);
} catch (e: any) {
if (e?.status === 400) {
this.usernameError.set('Ce nom d\'utilisateur est déjà pris.');
} else {
this.usernameError.set('Erreur lors de la mise à jour.');
}
}
this.loading.set(false);
}
// --- Bio ---
toggleEditBio() {
if (this.editingBio()) {
this.submitBio();
} else {
this.editingBio.set(true);
}
}
async submitBio() {
this.loading.set(true);
const user = this.authService.currentUser();
if (!user) return;
try {
await firstValueFrom(this.usersService.patchUserDescriptionEndpoint(
String(user.id), { description: this.bio() }
));
this.authService.updateCurrentUser({ description: this.bio() }); // 👈 maj locale
this.editingBio.set(false);
} catch (e) {
console.error('Erreur lors de la mise à jour de la bio', e);
}
this.loading.set(false);
}
// --- Photo ---
triggerFileInput() {
document.getElementById('photoInput')?.click();
}
async onPhotoChange(event: Event) {
const file = (event.target as HTMLInputElement).files?.[0];
if (!file) return;
onPhotoChange(event: Event): void {
const input = event.target as HTMLInputElement;
if (input.files && input.files[0]) {
const reader = new FileReader(); const reader = new FileReader();
reader.onload = (e) => { reader.onload = async () => {
this.profileImage.set(e.target?.result as string); const base64 = reader.result as string;
this.profileImage.set(base64);
this.loading.set(true);
const user = this.authService.currentUser();
if (!user) return;
try {
await firstValueFrom(this.usersService.patchUserProfilePictureEndpoint(
String(user.id), { profilePicture: base64 }
));
this.authService.updateCurrentUser({ profilePicture: base64 }); // 👈 maj locale
} catch (e) {
console.error('Erreur lors de la mise à jour de la photo', e);
}
this.loading.set(false);
}; };
reader.readAsDataURL(input.files[0]); reader.readAsDataURL(file);
}
}
triggerFileInput(): void {
const input = document.getElementById('photoInput') as HTMLInputElement;
input?.click();
}
toggleEditUsername(): void {
this.editingUsername.update((v) => !v);
}
toggleEditBio(): void {
this.editingBio.update((v) => !v);
} }
} }
@@ -1,5 +1,4 @@
<ion-content [fullscreen]="true" class="bg"> <ion-content [fullscreen]="true" class="bg">
<div class="container"> <div class="container">
<div class="logo-box"> <div class="logo-box">
@@ -8,34 +7,46 @@
<h1>Knots</h1> <h1>Knots</h1>
<div class="card"> <div class="card" [formGroup]="registerForm">
<h3>Inscrivez-vous à Knots !</h3> <h3>Inscrivez-vous à Knots !</h3>
<p class="subtitle">Commencez à nouer des liens !</p> <p class="subtitle">Commencez à nouer des liens !</p>
<ion-item lines="none" class="input"> <ion-item lines="none" class="input">
<ion-input placeholder="Nom d'utilisateur..."></ion-input> <ion-input placeholder="Nom d'utilisateur..." formControlName="username"></ion-input>
</ion-item> </ion-item>
<ion-item lines="none" class="input"> <ion-item lines="none" class="input">
<ion-input type="password" placeholder="Mot de passe..."></ion-input> <ion-input type="email" placeholder="Email..." formControlName="email"></ion-input>
</ion-item> </ion-item>
<ion-item lines="none" class="input"> <ion-item lines="none" class="input">
<ion-input type="password" placeholder="Confirmez votre mot de passe..."></ion-input> <ion-input type="tel" placeholder="Téléphone (10 chiffres)..." formControlName="tel"></ion-input>
</ion-item> </ion-item>
<ion-button expand="block" class="btn"> <ion-item lines="none" class="input">
Créer son compte <ion-input type="password" placeholder="Mot de passe..." formControlName="password"></ion-input>
</ion-item>
<ion-item lines="none" class="input">
<ion-input type="password" placeholder="Confirmez votre mot de passe..." formControlName="confirmPassword"></ion-input>
</ion-item>
<p *ngIf="registerForm.hasError('passwordMismatch')"
style="color:#d97070; font-size:13px; text-align:center; margin:0;">
Les mots de passe ne correspondent pas.
</p>
<ion-button expand="block" class="btn" (click)="submitForm()" [disabled]="isLoading">
{{ isLoading ? 'Création...' : 'Créer son compte' }}
</ion-button> </ion-button>
</div> </div>
<div class="signup"> <div class="signup">
Déjà un compte ?<br> Déjà un compte ?<br>
<a (click)="goToLogin()" >Connectez-vous ici</a> <a (click)="goToLogin()">Connectez-vous ici</a>
</div> </div>
</div> </div>
</ion-content> </ion-content>
@@ -1,30 +1,73 @@
import {Component, inject} from '@angular/core'; import { Component, inject } from '@angular/core';
import { import { IonButton, IonContent, IonInput, IonItem } from "@ionic/angular/standalone";
IonButton, import { Router } from "@angular/router";
IonCard, import { FormBuilder, ReactiveFormsModule, Validators } from "@angular/forms";
IonCardContent, import { CommonModule } from "@angular/common";
IonCardHeader, import { AuthService } from "../../core/auth/auth.service";
IonCardSubtitle,
IonCardTitle, IonContent, IonInput, IonItem
} from "@ionic/angular/standalone";
import {Router} from "@angular/router";
@Component({ @Component({
selector: 'app-register-form', selector: 'app-register-form',
imports: [ imports: [IonButton, IonInput, IonContent, IonItem, ReactiveFormsModule, CommonModule],
IonButton,
IonInput,
IonContent,
IonItem
],
templateUrl: './register-form.component.html', templateUrl: './register-form.component.html',
styleUrl: './register-form.component.css' styleUrl: './register-form.component.css'
}) })
export class RegisterFormComponent { export class RegisterFormComponent {
private router = inject(Router) private router = inject(Router);
private fb = inject(FormBuilder);
private authService = inject(AuthService);
isLoading = false;
registerForm = this.fb.group({
username: ['', [Validators.required, Validators.maxLength(50)]],
email: ['', [Validators.required, Validators.email, Validators.maxLength(70)]],
tel: ['', [Validators.required, Validators.minLength(10), Validators.maxLength(10)]],
password: ['', [Validators.required, Validators.minLength(12), Validators.maxLength(50)]],
confirmPassword: ['', [Validators.required]],
description: ['', [Validators.maxLength(200)]],
}, { validators: this.passwordMatchValidator });
passwordMatchValidator(form: any) {
const password = form.get('password')?.value;
const confirm = form.get('confirmPassword')?.value;
return password === confirm ? null : { passwordMismatch: true };
}
goToLogin() { goToLogin() {
this.router.navigate(['/login']); this.router.navigate(['/login']);
} }
async submitForm() {
console.log('form valid:', this.registerForm.valid);
console.log('form errors:', this.registerForm.errors);
console.log('form values:', this.registerForm.value);
if (this.registerForm.valid) {
this.isLoading = true;
try {
await this.authService.register(
this.registerForm.value.username!,
this.registerForm.value.password!,
this.registerForm.value.email!,
this.registerForm.value.tel!,
this.registerForm.value.description ?? null,
);
} catch (err: any) {
if (err.status === 409) {
console.error('Ce nom d\'utilisateur est déjà pris.');
} else {
console.error('Impossible de contacter le serveur.');
}
} finally {
this.isLoading = false;
}
} else {
Object.values(this.registerForm.controls).forEach(control => {
if (control.invalid) {
control.markAsDirty();
control.updateValueAndValidity({ onlySelf: true });
}
});
}
}
} }
@@ -26,16 +26,24 @@ model/knots-dto-key-create-key-dto.ts
model/knots-dto-key-delete-key-dto.ts model/knots-dto-key-delete-key-dto.ts
model/knots-dto-message-create-message-dto.ts model/knots-dto-message-create-message-dto.ts
model/knots-dto-message-delete-message-dto.ts model/knots-dto-message-delete-message-dto.ts
model/knots-dto-role-create-role-dto.ts model/knots-dto-message-get-message-details-dto.ts
model/knots-dto-role-delete-role-dto.ts model/knots-dto-role-delete-role-dto.ts
model/knots-dto-user-create-user-dto.ts model/knots-dto-user-create-user-dto.ts
model/knots-dto-user-delete-user-dto.ts model/knots-dto-user-delete-user-dto.ts
model/knots-dto-user-get-user-dto.ts model/knots-dto-user-get-user-dto.ts
model/knots-dto-user-login-response-dto.ts
model/knots-dto-user-login-user-dto.ts
model/knots-dto-user-update-user-contact-dto.ts model/knots-dto-user-update-user-contact-dto.ts
model/knots-dto-user-update-user-description-dto.ts model/knots-dto-user-update-user-description-dto.ts
model/knots-dto-user-update-user-password-dto.ts model/knots-dto-user-update-user-password-dto.ts
model/knots-dto-user-update-user-profile-picture-dto.ts model/knots-dto-user-update-user-profile-picture-dto.ts
model/knots-dto-user-update-username-dto.ts model/knots-dto-user-update-username-dto.ts
model/knots-endpoints-discussion-create-group-discussion-request.ts
model/knots-endpoints-discussion-create-private-discussion-request.ts
model/knots-endpoints-discussion-member-with-role-dto.ts
model/knots-endpoints-role-assign-role-request.ts
model/knots-endpoints-role-create-role-request.ts
model/knots-endpoints-role-role-dto.ts
model/models.ts model/models.ts
param.ts param.ts
provide-api.ts provide-api.ts
+420 -5
View File
@@ -22,6 +22,14 @@ import { FastEndpointsErrorResponse } from '../model/fast-endpoints-error-respon
import { KnotsDTODiscussionCreateDiscussionDto } from '../model/knots-dto-discussion-create-discussion-dto'; import { KnotsDTODiscussionCreateDiscussionDto } from '../model/knots-dto-discussion-create-discussion-dto';
// @ts-ignore // @ts-ignore
import { KnotsDTODiscussionDeleteDiscussionDto } from '../model/knots-dto-discussion-delete-discussion-dto'; import { KnotsDTODiscussionDeleteDiscussionDto } from '../model/knots-dto-discussion-delete-discussion-dto';
// @ts-ignore
import { KnotsDTOMessageGetMessageDetailsDto } from '../model/knots-dto-message-get-message-details-dto';
// @ts-ignore
import { KnotsEndpointsDiscussionCreateGroupDiscussionRequest } from '../model/knots-endpoints-discussion-create-group-discussion-request';
// @ts-ignore
import { KnotsEndpointsDiscussionCreatePrivateDiscussionRequest } from '../model/knots-endpoints-discussion-create-private-discussion-request';
// @ts-ignore
import { KnotsEndpointsDiscussionMemberWithRoleDto } from '../model/knots-endpoints-discussion-member-with-role-dto';
// @ts-ignore // @ts-ignore
import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
@@ -104,6 +112,142 @@ export class DiscussionsService extends BaseService {
); );
} }
/**
* @endpoint post /API/discussions/group
* @param knotsEndpointsDiscussionCreateGroupDiscussionRequest
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
* @param options additional options
*/
public createGroupDiscussionEndpoint(knotsEndpointsDiscussionCreateGroupDiscussionRequest: KnotsEndpointsDiscussionCreateGroupDiscussionRequest, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<object>;
public createGroupDiscussionEndpoint(knotsEndpointsDiscussionCreateGroupDiscussionRequest: KnotsEndpointsDiscussionCreateGroupDiscussionRequest, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<object>>;
public createGroupDiscussionEndpoint(knotsEndpointsDiscussionCreateGroupDiscussionRequest: KnotsEndpointsDiscussionCreateGroupDiscussionRequest, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<object>>;
public createGroupDiscussionEndpoint(knotsEndpointsDiscussionCreateGroupDiscussionRequest: KnotsEndpointsDiscussionCreateGroupDiscussionRequest, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (knotsEndpointsDiscussionCreateGroupDiscussionRequest === null || knotsEndpointsDiscussionCreateGroupDiscussionRequest === undefined) {
throw new Error('Required parameter knotsEndpointsDiscussionCreateGroupDiscussionRequest was null or undefined when calling createGroupDiscussionEndpoint.');
}
let localVarHeaders = this.defaultHeaders;
// authentication (JWTBearerAuth) required
localVarHeaders = this.configuration.addCredentialToHeaders('JWTBearerAuth', 'Authorization', localVarHeaders, 'Bearer ');
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
'application/json'
]);
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}
const localVarHttpContext: HttpContext = options?.context ?? new HttpContext();
const localVarTransferCache: boolean = options?.transferCache ?? true;
// to determine the Content-Type header
const consumes: string[] = [
'application/json'
];
const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
if (httpContentTypeSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
}
let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}
let localVarPath = `/API/discussions/group`;
const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<object>('post', `${basePath}${localVarPath}`,
{
context: localVarHttpContext,
body: knotsEndpointsDiscussionCreateGroupDiscussionRequest,
responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders,
observe: observe,
...(localVarTransferCache !== undefined ? { transferCache: localVarTransferCache } : {}),
reportProgress: reportProgress
}
);
}
/**
* @endpoint post /API/discussions/private
* @param knotsEndpointsDiscussionCreatePrivateDiscussionRequest
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
* @param options additional options
*/
public createPrivateDiscussionEndpoint(knotsEndpointsDiscussionCreatePrivateDiscussionRequest: KnotsEndpointsDiscussionCreatePrivateDiscussionRequest, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<object>;
public createPrivateDiscussionEndpoint(knotsEndpointsDiscussionCreatePrivateDiscussionRequest: KnotsEndpointsDiscussionCreatePrivateDiscussionRequest, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<object>>;
public createPrivateDiscussionEndpoint(knotsEndpointsDiscussionCreatePrivateDiscussionRequest: KnotsEndpointsDiscussionCreatePrivateDiscussionRequest, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<object>>;
public createPrivateDiscussionEndpoint(knotsEndpointsDiscussionCreatePrivateDiscussionRequest: KnotsEndpointsDiscussionCreatePrivateDiscussionRequest, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (knotsEndpointsDiscussionCreatePrivateDiscussionRequest === null || knotsEndpointsDiscussionCreatePrivateDiscussionRequest === undefined) {
throw new Error('Required parameter knotsEndpointsDiscussionCreatePrivateDiscussionRequest was null or undefined when calling createPrivateDiscussionEndpoint.');
}
let localVarHeaders = this.defaultHeaders;
// authentication (JWTBearerAuth) required
localVarHeaders = this.configuration.addCredentialToHeaders('JWTBearerAuth', 'Authorization', localVarHeaders, 'Bearer ');
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
'application/json'
]);
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}
const localVarHttpContext: HttpContext = options?.context ?? new HttpContext();
const localVarTransferCache: boolean = options?.transferCache ?? true;
// to determine the Content-Type header
const consumes: string[] = [
'application/json'
];
const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
if (httpContentTypeSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
}
let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}
let localVarPath = `/API/discussions/private`;
const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<object>('post', `${basePath}${localVarPath}`,
{
context: localVarHttpContext,
body: knotsEndpointsDiscussionCreatePrivateDiscussionRequest,
responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders,
observe: observe,
...(localVarTransferCache !== undefined ? { transferCache: localVarTransferCache } : {}),
reportProgress: reportProgress
}
);
}
/** /**
* @endpoint delete /API/discussions * @endpoint delete /API/discussions
* @param knotsDTODiscussionDeleteDiscussionDto * @param knotsDTODiscussionDeleteDiscussionDto
@@ -172,29 +316,75 @@ export class DiscussionsService extends BaseService {
/** /**
* @endpoint get /API/discussions * @endpoint get /API/discussions
* @param id * @param id
* @param name
* @param isGroup
* @param membersCount
* @param groupId
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress. * @param reportProgress flag to report request and response progress.
* @param options additional options * @param options additional options
*/ */
public getDiscussionEndpoint(id: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<any>; public getDiscussionEndpoint(id: number, name: string, isGroup: boolean, membersCount?: number, groupId?: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<any>;
public getDiscussionEndpoint(id: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<any>>; public getDiscussionEndpoint(id: number, name: string, isGroup: boolean, membersCount?: number, groupId?: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<any>>;
public getDiscussionEndpoint(id: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<any>>; public getDiscussionEndpoint(id: number, name: string, isGroup: boolean, membersCount?: number, groupId?: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<any>>;
public getDiscussionEndpoint(id: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<any> { public getDiscussionEndpoint(id: number, name: string, isGroup: boolean, membersCount?: number, groupId?: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (id === null || id === undefined) { if (id === null || id === undefined) {
throw new Error('Required parameter id was null or undefined when calling getDiscussionEndpoint.'); throw new Error('Required parameter id was null or undefined when calling getDiscussionEndpoint.');
} }
if (name === null || name === undefined) {
throw new Error('Required parameter name was null or undefined when calling getDiscussionEndpoint.');
}
if (isGroup === null || isGroup === undefined) {
throw new Error('Required parameter isGroup was null or undefined when calling getDiscussionEndpoint.');
}
let localVarQueryParameters = new OpenApiHttpParams(this.encoder); let localVarQueryParameters = new OpenApiHttpParams(this.encoder);
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'Id', 'id',
<any>id, <any>id,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
); );
localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters,
'name',
<any>name,
QueryParamStyle.Form,
true,
);
localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters,
'isGroup',
<any>isGroup,
QueryParamStyle.Form,
true,
);
localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters,
'membersCount',
<any>membersCount,
QueryParamStyle.Form,
true,
);
localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters,
'groupId',
<any>groupId,
QueryParamStyle.Form,
true,
);
let localVarHeaders = this.defaultHeaders; let localVarHeaders = this.defaultHeaders;
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([ const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
@@ -235,4 +425,229 @@ export class DiscussionsService extends BaseService {
); );
} }
/**
* @endpoint get /API/discussions/{discussionId}/members
* @param discussionId
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
* @param options additional options
*/
public getDiscussionMembersEndpoint(discussionId: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<Array<string>>;
public getDiscussionMembersEndpoint(discussionId: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<Array<string>>>;
public getDiscussionMembersEndpoint(discussionId: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<Array<string>>>;
public getDiscussionMembersEndpoint(discussionId: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (discussionId === null || discussionId === undefined) {
throw new Error('Required parameter discussionId was null or undefined when calling getDiscussionMembersEndpoint.');
}
let localVarHeaders = this.defaultHeaders;
// authentication (JWTBearerAuth) required
localVarHeaders = this.configuration.addCredentialToHeaders('JWTBearerAuth', 'Authorization', localVarHeaders, 'Bearer ');
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
'application/json'
]);
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}
const localVarHttpContext: HttpContext = options?.context ?? new HttpContext();
const localVarTransferCache: boolean = options?.transferCache ?? true;
let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}
let localVarPath = `/API/discussions/${this.configuration.encodeParam({name: "discussionId", value: discussionId, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/members`;
const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<Array<string>>('get', `${basePath}${localVarPath}`,
{
context: localVarHttpContext,
responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders,
observe: observe,
...(localVarTransferCache !== undefined ? { transferCache: localVarTransferCache } : {}),
reportProgress: reportProgress
}
);
}
/**
* @endpoint get /API/discussions/{discussionId}/members/roles
* @param discussionId
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
* @param options additional options
*/
public getDiscussionMembersWithRolesEndpoint(discussionId: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<Array<KnotsEndpointsDiscussionMemberWithRoleDto>>;
public getDiscussionMembersWithRolesEndpoint(discussionId: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<Array<KnotsEndpointsDiscussionMemberWithRoleDto>>>;
public getDiscussionMembersWithRolesEndpoint(discussionId: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<Array<KnotsEndpointsDiscussionMemberWithRoleDto>>>;
public getDiscussionMembersWithRolesEndpoint(discussionId: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (discussionId === null || discussionId === undefined) {
throw new Error('Required parameter discussionId was null or undefined when calling getDiscussionMembersWithRolesEndpoint.');
}
let localVarHeaders = this.defaultHeaders;
// authentication (JWTBearerAuth) required
localVarHeaders = this.configuration.addCredentialToHeaders('JWTBearerAuth', 'Authorization', localVarHeaders, 'Bearer ');
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
'application/json'
]);
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}
const localVarHttpContext: HttpContext = options?.context ?? new HttpContext();
const localVarTransferCache: boolean = options?.transferCache ?? true;
let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}
let localVarPath = `/API/discussions/${this.configuration.encodeParam({name: "discussionId", value: discussionId, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/members/roles`;
const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<Array<KnotsEndpointsDiscussionMemberWithRoleDto>>('get', `${basePath}${localVarPath}`,
{
context: localVarHttpContext,
responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders,
observe: observe,
...(localVarTransferCache !== undefined ? { transferCache: localVarTransferCache } : {}),
reportProgress: reportProgress
}
);
}
/**
* @endpoint get /API/discussions/{discussionId}/messages
* @param discussionId
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
* @param options additional options
*/
public getMessageEndpoint(discussionId: number, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<Array<KnotsDTOMessageGetMessageDetailsDto>>;
public getMessageEndpoint(discussionId: number, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<Array<KnotsDTOMessageGetMessageDetailsDto>>>;
public getMessageEndpoint(discussionId: number, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<Array<KnotsDTOMessageGetMessageDetailsDto>>>;
public getMessageEndpoint(discussionId: number, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (discussionId === null || discussionId === undefined) {
throw new Error('Required parameter discussionId was null or undefined when calling getMessageEndpoint.');
}
let localVarHeaders = this.defaultHeaders;
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
'application/json'
]);
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}
const localVarHttpContext: HttpContext = options?.context ?? new HttpContext();
const localVarTransferCache: boolean = options?.transferCache ?? true;
let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}
let localVarPath = `/API/discussions/${this.configuration.encodeParam({name: "discussionId", value: discussionId, in: "path", style: "simple", explode: false, dataType: "number", dataFormat: "int32"})}/messages`;
const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<Array<KnotsDTOMessageGetMessageDetailsDto>>('get', `${basePath}${localVarPath}`,
{
context: localVarHttpContext,
responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders,
observe: observe,
...(localVarTransferCache !== undefined ? { transferCache: localVarTransferCache } : {}),
reportProgress: reportProgress
}
);
}
/**
* @endpoint get /API/discussions/my
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
* @param options additional options
*/
public getMyDiscussionEndpoint(observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<Array<object>>;
public getMyDiscussionEndpoint(observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<Array<object>>>;
public getMyDiscussionEndpoint(observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<Array<object>>>;
public getMyDiscussionEndpoint(observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
let localVarHeaders = this.defaultHeaders;
// authentication (JWTBearerAuth) required
localVarHeaders = this.configuration.addCredentialToHeaders('JWTBearerAuth', 'Authorization', localVarHeaders, 'Bearer ');
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
'application/json'
]);
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}
const localVarHttpContext: HttpContext = options?.context ?? new HttpContext();
const localVarTransferCache: boolean = options?.transferCache ?? true;
let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}
let localVarPath = `/API/discussions/my`;
const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<Array<object>>('get', `${basePath}${localVarPath}`,
{
context: localVarHttpContext,
responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders,
observe: observe,
...(localVarTransferCache !== undefined ? { transferCache: localVarTransferCache } : {}),
reportProgress: reportProgress
}
);
}
} }
+84 -7
View File
@@ -28,6 +28,8 @@ import { KnotsDTOGroupUpdateGroupMembersAmountDto } from '../model/knots-dto-gro
import { KnotsDTOGroupUpdateGroupNameDto } from '../model/knots-dto-group-update-group-name-dto'; import { KnotsDTOGroupUpdateGroupNameDto } from '../model/knots-dto-group-update-group-name-dto';
// @ts-ignore // @ts-ignore
import { KnotsDTOGroupUpdateGroupProfilePictureDto } from '../model/knots-dto-group-update-group-profile-picture-dto'; import { KnotsDTOGroupUpdateGroupProfilePictureDto } from '../model/knots-dto-group-update-group-profile-picture-dto';
// @ts-ignore
import { KnotsEndpointsRoleAssignRoleRequest } from '../model/knots-endpoints-role-assign-role-request';
// @ts-ignore // @ts-ignore
import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
@@ -45,6 +47,81 @@ export class GroupsService extends BaseService {
super(basePath, configuration); super(basePath, configuration);
} }
/**
* @endpoint post /API/groups/{groupId}/members/{userId}/role
* @param groupId
* @param userId
* @param knotsEndpointsRoleAssignRoleRequest
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
* @param options additional options
*/
public assignRoleEndpoint(groupId: string, userId: string, knotsEndpointsRoleAssignRoleRequest: KnotsEndpointsRoleAssignRoleRequest, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<any>;
public assignRoleEndpoint(groupId: string, userId: string, knotsEndpointsRoleAssignRoleRequest: KnotsEndpointsRoleAssignRoleRequest, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<any>>;
public assignRoleEndpoint(groupId: string, userId: string, knotsEndpointsRoleAssignRoleRequest: KnotsEndpointsRoleAssignRoleRequest, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<any>>;
public assignRoleEndpoint(groupId: string, userId: string, knotsEndpointsRoleAssignRoleRequest: KnotsEndpointsRoleAssignRoleRequest, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (groupId === null || groupId === undefined) {
throw new Error('Required parameter groupId was null or undefined when calling assignRoleEndpoint.');
}
if (userId === null || userId === undefined) {
throw new Error('Required parameter userId was null or undefined when calling assignRoleEndpoint.');
}
if (knotsEndpointsRoleAssignRoleRequest === null || knotsEndpointsRoleAssignRoleRequest === undefined) {
throw new Error('Required parameter knotsEndpointsRoleAssignRoleRequest was null or undefined when calling assignRoleEndpoint.');
}
let localVarHeaders = this.defaultHeaders;
// authentication (JWTBearerAuth) required
localVarHeaders = this.configuration.addCredentialToHeaders('JWTBearerAuth', 'Authorization', localVarHeaders, 'Bearer ');
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
]);
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}
const localVarHttpContext: HttpContext = options?.context ?? new HttpContext();
const localVarTransferCache: boolean = options?.transferCache ?? true;
// to determine the Content-Type header
const consumes: string[] = [
'application/json'
];
const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
if (httpContentTypeSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
}
let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}
let localVarPath = `/API/groups/${this.configuration.encodeParam({name: "groupId", value: groupId, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/members/${this.configuration.encodeParam({name: "userId", value: userId, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}/role`;
const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<any>('post', `${basePath}${localVarPath}`,
{
context: localVarHttpContext,
body: knotsEndpointsRoleAssignRoleRequest,
responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders,
observe: observe,
...(localVarTransferCache !== undefined ? { transferCache: localVarTransferCache } : {}),
reportProgress: reportProgress
}
);
}
/** /**
* @endpoint post /API/groups * @endpoint post /API/groups
* @param knotsDTOGroupCreateGroupDto * @param knotsDTOGroupCreateGroupDto
@@ -200,7 +277,7 @@ export class GroupsService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'Id', 'id',
<any>id, <any>id,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -209,7 +286,7 @@ export class GroupsService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'Nom', 'nom',
<any>nom, <any>nom,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -218,7 +295,7 @@ export class GroupsService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'NombreMembres', 'nombreMembres',
<any>nombreMembres, <any>nombreMembres,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -227,7 +304,7 @@ export class GroupsService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'ProfilePicture', 'profilePicture',
<any>profilePicture, <any>profilePicture,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -275,7 +352,7 @@ export class GroupsService extends BaseService {
} }
/** /**
* @endpoint patch /API/groups/{Id}/membersAmount * @endpoint patch /API/groups/{id}/membersAmount
* @param id * @param id
* @param knotsDTOGroupUpdateGroupMembersAmountDto * @param knotsDTOGroupUpdateGroupMembersAmountDto
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
@@ -344,7 +421,7 @@ export class GroupsService extends BaseService {
} }
/** /**
* @endpoint patch /API/groups/{Id}/name * @endpoint patch /API/groups/{id}/name
* @param id * @param id
* @param knotsDTOGroupUpdateGroupNameDto * @param knotsDTOGroupUpdateGroupNameDto
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
@@ -413,7 +490,7 @@ export class GroupsService extends BaseService {
} }
/** /**
* @endpoint patch /API/groups/{Id}/profilePicture * @endpoint patch /API/groups/{id}/profilePicture
* @param id * @param id
* @param knotsDTOGroupUpdateGroupProfilePictureDto * @param knotsDTOGroupUpdateGroupProfilePictureDto
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
+2 -2
View File
@@ -193,7 +193,7 @@ export class KeysService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'Id', 'id',
<any>id2, <any>id2,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -202,7 +202,7 @@ export class KeysService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'EnKey', 'enKey',
<any>enKey, <any>enKey,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -168,110 +168,4 @@ export class MessagesService extends BaseService {
); );
} }
/**
* @endpoint get /API/messages/{@Id}
* @param id
* @param id2
* @param date
* @param type
* @param contenu
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
* @param options additional options
*/
public getMessageEndpoint(id: string, id2: number, date: string, type: boolean, contenu?: string, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<any>;
public getMessageEndpoint(id: string, id2: number, date: string, type: boolean, contenu?: string, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<any>>;
public getMessageEndpoint(id: string, id2: number, date: string, type: boolean, contenu?: string, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<any>>;
public getMessageEndpoint(id: string, id2: number, date: string, type: boolean, contenu?: string, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: undefined, context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (id === null || id === undefined) {
throw new Error('Required parameter id was null or undefined when calling getMessageEndpoint.');
}
if (id2 === null || id2 === undefined) {
throw new Error('Required parameter id2 was null or undefined when calling getMessageEndpoint.');
}
if (date === null || date === undefined) {
throw new Error('Required parameter date was null or undefined when calling getMessageEndpoint.');
}
if (type === null || type === undefined) {
throw new Error('Required parameter type was null or undefined when calling getMessageEndpoint.');
}
let localVarQueryParameters = new OpenApiHttpParams(this.encoder);
localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters,
'Id',
<any>id2,
QueryParamStyle.Form,
true,
);
localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters,
'Contenu',
<any>contenu,
QueryParamStyle.Form,
true,
);
localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters,
'Date',
<any>date,
QueryParamStyle.Form,
true,
);
localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters,
'Type',
<any>type,
QueryParamStyle.Form,
true,
);
let localVarHeaders = this.defaultHeaders;
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
]);
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}
const localVarHttpContext: HttpContext = options?.context ?? new HttpContext();
const localVarTransferCache: boolean = options?.transferCache ?? true;
let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}
let localVarPath = `/API/messages/${this.configuration.encodeParam({name: "id", value: id, in: "path", style: "simple", explode: false, dataType: "string", dataFormat: undefined})}`;
const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<any>('get', `${basePath}${localVarPath}`,
{
context: localVarHttpContext,
params: localVarQueryParameters.toHttpParams(),
responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders,
observe: observe,
...(localVarTransferCache !== undefined ? { transferCache: localVarTransferCache } : {}),
reportProgress: reportProgress
}
);
}
} }
+18 -13
View File
@@ -19,9 +19,11 @@ import { OpenApiHttpParams, QueryParamStyle } from '../query.params';
// @ts-ignore // @ts-ignore
import { FastEndpointsErrorResponse } from '../model/fast-endpoints-error-response'; import { FastEndpointsErrorResponse } from '../model/fast-endpoints-error-response';
// @ts-ignore // @ts-ignore
import { KnotsDTORoleCreateRoleDto } from '../model/knots-dto-role-create-role-dto';
// @ts-ignore
import { KnotsDTORoleDeleteRoleDto } from '../model/knots-dto-role-delete-role-dto'; import { KnotsDTORoleDeleteRoleDto } from '../model/knots-dto-role-delete-role-dto';
// @ts-ignore
import { KnotsEndpointsRoleCreateRoleRequest } from '../model/knots-endpoints-role-create-role-request';
// @ts-ignore
import { KnotsEndpointsRoleRoleDto } from '../model/knots-endpoints-role-role-dto';
// @ts-ignore // @ts-ignore
import { BASE_PATH, COLLECTION_FORMATS } from '../variables'; import { BASE_PATH, COLLECTION_FORMATS } from '../variables';
@@ -41,23 +43,26 @@ export class RolesService extends BaseService {
/** /**
* @endpoint post /API/roles * @endpoint post /API/roles
* @param knotsDTORoleCreateRoleDto * @param knotsEndpointsRoleCreateRoleRequest
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress. * @param reportProgress flag to report request and response progress.
* @param options additional options * @param options additional options
*/ */
public createRoleEndpoint(knotsDTORoleCreateRoleDto: KnotsDTORoleCreateRoleDto, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/problem+json', context?: HttpContext, transferCache?: boolean}): Observable<any>; public createRoleEndpoint(knotsEndpointsRoleCreateRoleRequest: KnotsEndpointsRoleCreateRoleRequest, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<KnotsEndpointsRoleRoleDto>;
public createRoleEndpoint(knotsDTORoleCreateRoleDto: KnotsDTORoleCreateRoleDto, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/problem+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<any>>; public createRoleEndpoint(knotsEndpointsRoleCreateRoleRequest: KnotsEndpointsRoleCreateRoleRequest, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<KnotsEndpointsRoleRoleDto>>;
public createRoleEndpoint(knotsDTORoleCreateRoleDto: KnotsDTORoleCreateRoleDto, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/problem+json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<any>>; public createRoleEndpoint(knotsEndpointsRoleCreateRoleRequest: KnotsEndpointsRoleCreateRoleRequest, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<KnotsEndpointsRoleRoleDto>>;
public createRoleEndpoint(knotsDTORoleCreateRoleDto: KnotsDTORoleCreateRoleDto, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/problem+json', context?: HttpContext, transferCache?: boolean}): Observable<any> { public createRoleEndpoint(knotsEndpointsRoleCreateRoleRequest: KnotsEndpointsRoleCreateRoleRequest, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (knotsDTORoleCreateRoleDto === null || knotsDTORoleCreateRoleDto === undefined) { if (knotsEndpointsRoleCreateRoleRequest === null || knotsEndpointsRoleCreateRoleRequest === undefined) {
throw new Error('Required parameter knotsDTORoleCreateRoleDto was null or undefined when calling createRoleEndpoint.'); throw new Error('Required parameter knotsEndpointsRoleCreateRoleRequest was null or undefined when calling createRoleEndpoint.');
} }
let localVarHeaders = this.defaultHeaders; let localVarHeaders = this.defaultHeaders;
// authentication (JWTBearerAuth) required
localVarHeaders = this.configuration.addCredentialToHeaders('JWTBearerAuth', 'Authorization', localVarHeaders, 'Bearer ');
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([ const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
'application/problem+json' 'application/json'
]); ]);
if (localVarHttpHeaderAcceptSelected !== undefined) { if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected); localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
@@ -90,10 +95,10 @@ export class RolesService extends BaseService {
let localVarPath = `/API/roles`; let localVarPath = `/API/roles`;
const { basePath, withCredentials } = this.configuration; const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<any>('post', `${basePath}${localVarPath}`, return this.httpClient.request<KnotsEndpointsRoleRoleDto>('post', `${basePath}${localVarPath}`,
{ {
context: localVarHttpContext, context: localVarHttpContext,
body: knotsDTORoleCreateRoleDto, body: knotsEndpointsRoleCreateRoleRequest,
responseType: <any>responseType_, responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}), ...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders, headers: localVarHeaders,
@@ -170,7 +175,7 @@ export class RolesService extends BaseService {
} }
/** /**
* @endpoint get /API/roles/{Libelle} * @endpoint get /API/roles/{libelle}
* @param libelle * @param libelle
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress. * @param reportProgress flag to report request and response progress.
+77 -8
View File
@@ -25,6 +25,10 @@ import { KnotsDTOUserDeleteUserDto } from '../model/knots-dto-user-delete-user-d
// @ts-ignore // @ts-ignore
import { KnotsDTOUserGetUserDto } from '../model/knots-dto-user-get-user-dto'; import { KnotsDTOUserGetUserDto } from '../model/knots-dto-user-get-user-dto';
// @ts-ignore // @ts-ignore
import { KnotsDTOUserLoginResponseDto } from '../model/knots-dto-user-login-response-dto';
// @ts-ignore
import { KnotsDTOUserLoginUserDto } from '../model/knots-dto-user-login-user-dto';
// @ts-ignore
import { KnotsDTOUserUpdateUserContactDto } from '../model/knots-dto-user-update-user-contact-dto'; import { KnotsDTOUserUpdateUserContactDto } from '../model/knots-dto-user-update-user-contact-dto';
// @ts-ignore // @ts-ignore
import { KnotsDTOUserUpdateUserDescriptionDto } from '../model/knots-dto-user-update-user-description-dto'; import { KnotsDTOUserUpdateUserDescriptionDto } from '../model/knots-dto-user-update-user-description-dto';
@@ -239,7 +243,7 @@ export class UsersService extends BaseService {
} }
/** /**
* @endpoint get /API/users/{Username} * @endpoint get /API/users/{username}
* @param username * @param username
* @param description * @param description
* @param password * @param password
@@ -262,7 +266,7 @@ export class UsersService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'Description', 'description',
<any>description, <any>description,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -271,7 +275,7 @@ export class UsersService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'Password', 'password',
<any>password, <any>password,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -280,7 +284,7 @@ export class UsersService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'Email', 'email',
<any>email, <any>email,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -289,7 +293,7 @@ export class UsersService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'Tel', 'tel',
<any>tel, <any>tel,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -298,7 +302,7 @@ export class UsersService extends BaseService {
localVarQueryParameters = this.addToHttpParams( localVarQueryParameters = this.addToHttpParams(
localVarQueryParameters, localVarQueryParameters,
'ProfilePicture', 'profilePicture',
<any>profilePicture, <any>profilePicture,
QueryParamStyle.Form, QueryParamStyle.Form,
true, true,
@@ -346,7 +350,72 @@ export class UsersService extends BaseService {
} }
/** /**
* @endpoint patch /API/users/{Id}/contact * @endpoint post /API/users/login
* @param knotsDTOUserLoginUserDto
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
* @param reportProgress flag to report request and response progress.
* @param options additional options
*/
public loginEndpoint(knotsDTOUserLoginUserDto: KnotsDTOUserLoginUserDto, observe?: 'body', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<KnotsDTOUserLoginResponseDto>;
public loginEndpoint(knotsDTOUserLoginUserDto: KnotsDTOUserLoginUserDto, observe?: 'response', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpResponse<KnotsDTOUserLoginResponseDto>>;
public loginEndpoint(knotsDTOUserLoginUserDto: KnotsDTOUserLoginUserDto, observe?: 'events', reportProgress?: boolean, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<HttpEvent<KnotsDTOUserLoginResponseDto>>;
public loginEndpoint(knotsDTOUserLoginUserDto: KnotsDTOUserLoginUserDto, observe: any = 'body', reportProgress: boolean = false, options?: {httpHeaderAccept?: 'application/json', context?: HttpContext, transferCache?: boolean}): Observable<any> {
if (knotsDTOUserLoginUserDto === null || knotsDTOUserLoginUserDto === undefined) {
throw new Error('Required parameter knotsDTOUserLoginUserDto was null or undefined when calling loginEndpoint.');
}
let localVarHeaders = this.defaultHeaders;
const localVarHttpHeaderAcceptSelected: string | undefined = options?.httpHeaderAccept ?? this.configuration.selectHeaderAccept([
'application/json'
]);
if (localVarHttpHeaderAcceptSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Accept', localVarHttpHeaderAcceptSelected);
}
const localVarHttpContext: HttpContext = options?.context ?? new HttpContext();
const localVarTransferCache: boolean = options?.transferCache ?? true;
// to determine the Content-Type header
const consumes: string[] = [
'application/json'
];
const httpContentTypeSelected: string | undefined = this.configuration.selectHeaderContentType(consumes);
if (httpContentTypeSelected !== undefined) {
localVarHeaders = localVarHeaders.set('Content-Type', httpContentTypeSelected);
}
let responseType_: 'text' | 'json' | 'blob' = 'json';
if (localVarHttpHeaderAcceptSelected) {
if (localVarHttpHeaderAcceptSelected.startsWith('text')) {
responseType_ = 'text';
} else if (this.configuration.isJsonMime(localVarHttpHeaderAcceptSelected)) {
responseType_ = 'json';
} else {
responseType_ = 'blob';
}
}
let localVarPath = `/API/users/login`;
const { basePath, withCredentials } = this.configuration;
return this.httpClient.request<KnotsDTOUserLoginResponseDto>('post', `${basePath}${localVarPath}`,
{
context: localVarHttpContext,
body: knotsDTOUserLoginUserDto,
responseType: <any>responseType_,
...(withCredentials ? { withCredentials } : {}),
headers: localVarHeaders,
observe: observe,
...(localVarTransferCache !== undefined ? { transferCache: localVarTransferCache } : {}),
reportProgress: reportProgress
}
);
}
/**
* @endpoint patch /API/users/{id}/contact
* @param id * @param id
* @param knotsDTOUserUpdateUserContactDto * @param knotsDTOUserUpdateUserContactDto
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
@@ -484,7 +553,7 @@ export class UsersService extends BaseService {
} }
/** /**
* @endpoint patch /API/users/{Id}/password * @endpoint patch /API/users/{id}/password
* @param id * @param id
* @param knotsDTOUserUpdateUserPasswordDto * @param knotsDTOUserUpdateUserPasswordDto
* @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body. * @param observe set whether or not to return the data Observable as the body, response or events. defaults to returning the body.
@@ -10,6 +10,6 @@
export interface KnotsDTODiscussionCreateDiscussionDto { export interface KnotsDTODiscussionCreateDiscussionDto {
id?: number; id: number;
} }
@@ -10,6 +10,6 @@
export interface KnotsDTODiscussionDeleteDiscussionDto { export interface KnotsDTODiscussionDeleteDiscussionDto {
id?: number; id: number;
} }
@@ -10,8 +10,8 @@
export interface KnotsDTOGroupCreateGroupDto { export interface KnotsDTOGroupCreateGroupDto {
nom?: string | null; nom: string;
nombreMembres?: number; nombreMembres: number;
profilePicture?: string | null; profilePicture?: string | null;
} }
@@ -10,6 +10,6 @@
export interface KnotsDTOGroupDeleteGroupDto { export interface KnotsDTOGroupDeleteGroupDto {
id?: number | null; id: number;
} }
@@ -10,6 +10,6 @@
export interface KnotsDTOGroupUpdateGroupMembersAmountDto { export interface KnotsDTOGroupUpdateGroupMembersAmountDto {
membersAmount?: number; membersAmount: number;
} }
@@ -10,6 +10,6 @@
export interface KnotsDTOGroupUpdateGroupNameDto { export interface KnotsDTOGroupUpdateGroupNameDto {
name?: string | null; name: string;
} }
@@ -10,6 +10,6 @@
export interface KnotsDTOKeyCreateKeyDto { export interface KnotsDTOKeyCreateKeyDto {
enKey?: string | null; enKey: string;
} }
@@ -10,6 +10,6 @@
export interface KnotsDTOKeyDeleteKeyDto { export interface KnotsDTOKeyDeleteKeyDto {
id?: number; id: number;
} }
@@ -10,8 +10,8 @@
export interface KnotsDTOMessageCreateMessageDto { export interface KnotsDTOMessageCreateMessageDto {
contenu?: string | null; contenu: string;
date?: string; date: string;
type?: boolean; type: boolean;
} }
@@ -0,0 +1,20 @@
/**
* Knots
*
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export interface KnotsDTOMessageGetMessageDetailsDto {
id?: number;
contenu?: string | null;
date?: string;
type?: boolean;
userId?: number;
authorName?: string;
}
@@ -10,6 +10,6 @@
export interface KnotsDTORoleDeleteRoleDto { export interface KnotsDTORoleDeleteRoleDto {
id?: number; id: number;
} }
@@ -0,0 +1,21 @@
/**
* Knots
*
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export interface KnotsDTOUserLoginResponseDto {
token?: string | null;
id?: number;
username?: string | null;
email?: string | null;
tel?: string | null;
profilePicture?: string | null;
description?: string | null;
}
@@ -0,0 +1,16 @@
/**
* Knots
*
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export interface KnotsDTOUserLoginUserDto {
username?: string | null;
password?: string | null;
}
@@ -10,7 +10,7 @@
export interface KnotsDTOUserUpdateUserContactDto { export interface KnotsDTOUserUpdateUserContactDto {
email?: string | null; email: string;
tel?: string | null; tel: string;
} }
@@ -11,6 +11,6 @@
export interface KnotsDTOUserUpdateUserProfilePictureDto { export interface KnotsDTOUserUpdateUserProfilePictureDto {
id?: number; id?: number;
profilePicture?: string | null; profilePicture: string;
} }
@@ -11,6 +11,6 @@
export interface KnotsDTOUserUpdateUsernameDto { export interface KnotsDTOUserUpdateUsernameDto {
id?: number; id?: number;
username?: string | null; username: string;
} }
@@ -0,0 +1,16 @@
/**
* Knots
*
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export interface KnotsEndpointsDiscussionCreateGroupDiscussionRequest {
groupName?: string;
usernames?: Array<string>;
}
@@ -0,0 +1,15 @@
/**
* Knots
*
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export interface KnotsEndpointsDiscussionCreatePrivateDiscussionRequest {
username?: string;
}
@@ -0,0 +1,18 @@
/**
* Knots
*
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export interface KnotsEndpointsDiscussionMemberWithRoleDto {
userId?: number;
username?: string;
roleId?: number | null;
roleLibelle?: string | null;
}
@@ -9,7 +9,7 @@
*/ */
export interface KnotsDTORoleCreateRoleDto { export interface KnotsEndpointsRoleAssignRoleRequest {
libelle?: string | null; roleId?: number;
} }
@@ -0,0 +1,15 @@
/**
* Knots
*
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export interface KnotsEndpointsRoleCreateRoleRequest {
libelle?: string;
}
@@ -0,0 +1,16 @@
/**
* Knots
*
*
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
export interface KnotsEndpointsRoleRoleDto {
id?: number;
libelle?: string;
}
+9 -1
View File
@@ -10,13 +10,21 @@ export * from './knots-dto-key-create-key-dto';
export * from './knots-dto-key-delete-key-dto'; export * from './knots-dto-key-delete-key-dto';
export * from './knots-dto-message-create-message-dto'; export * from './knots-dto-message-create-message-dto';
export * from './knots-dto-message-delete-message-dto'; export * from './knots-dto-message-delete-message-dto';
export * from './knots-dto-role-create-role-dto'; export * from './knots-dto-message-get-message-details-dto';
export * from './knots-dto-role-delete-role-dto'; export * from './knots-dto-role-delete-role-dto';
export * from './knots-dto-user-create-user-dto'; export * from './knots-dto-user-create-user-dto';
export * from './knots-dto-user-delete-user-dto'; export * from './knots-dto-user-delete-user-dto';
export * from './knots-dto-user-get-user-dto'; export * from './knots-dto-user-get-user-dto';
export * from './knots-dto-user-login-response-dto';
export * from './knots-dto-user-login-user-dto';
export * from './knots-dto-user-update-user-contact-dto'; export * from './knots-dto-user-update-user-contact-dto';
export * from './knots-dto-user-update-user-description-dto'; export * from './knots-dto-user-update-user-description-dto';
export * from './knots-dto-user-update-user-password-dto'; export * from './knots-dto-user-update-user-password-dto';
export * from './knots-dto-user-update-user-profile-picture-dto'; export * from './knots-dto-user-update-user-profile-picture-dto';
export * from './knots-dto-user-update-username-dto'; export * from './knots-dto-user-update-username-dto';
export * from './knots-endpoints-discussion-create-group-discussion-request';
export * from './knots-endpoints-discussion-create-private-discussion-request';
export * from './knots-endpoints-discussion-member-with-role-dto';
export * from './knots-endpoints-role-assign-role-request';
export * from './knots-endpoints-role-create-role-request';
export * from './knots-endpoints-role-role-dto';