# Projet Nooky Hack-md Hugo : https://hackmd.io/gGTMrRf0RNa2HRShQXc-zQ?both Hack-md : https://hackmd.io/-kQmEeB5RIy5lJAObPeIEg Mermaid : https://mermaid.js.org/syntax/entityRelationshipDiagram.html Nooky application allows exchange second-hand clothes, shoes and accessories. --- Doc - spring security https://hackmd.io/-kQmEeB5RIy5lJAObPeIEg Github - auth0 - Java JWT https://github.com/auth0/java-jwt ___ ## Entités vers 2 ### Users <u>Email</u> Password Username Firstname Lastname Picture Created at ### Addresses <u>Road</u> <u>Zip code</u> <u>City</u> ### Products <u>Product Reference</u> Name Description Picture Added at ### Types <u>Type Reference</u> Type (skirt, shirt, shoes, etc.) ### Sizes <u>Size Reference</u> Size for clothes Size for shoes ### Categories <u>Category Reference</u> Category (women or men or kids or intersex) Description ___ Users -> add --> Products (1:N) Users -> live at --> Adresses (1:1) Products -> are wished to be exchanged with --> Products (1:N) Products -> are grouped by --> Categories (N:1) Products -> are classified by --> Types (N:1) Products -> are defined by --> Sizes (N:1) --- ## Entities representation vers 2 ```mermaid erDiagram Users ||--o{ Products : "add" Users ||--|| Addresses : "live at" Products ||--o{ Products : "are wished to be exchanged with" Categories ||--o{ Products : "contains" Types ||--o{ Products : "classified" Sizes ||--o{ Products : "defined" Users { string Email string Password string Username string Firstname string Lastname string Picture date CreatedAt } Addresses { string Road int ZipCode string City } Products { string ProductReference string Name string Description string Picture date AddedAt } Categories { string CategoryReference string Category string Description } Sizes { string SizeReference string Size for clothes int Size for shoes } Types { string TypeReference string Type } ``` ___ Entités à ajouter plus tard ### -> Colors Reference (identifier) Name Hexadécimal ### -> Transaction Reference (identifier) Transaction_type (Donate or Exchange or Sale) ### -> Communities Name (identifier) Description Picture Created_At ### -> Membership Reference (identifier) Role (Community_Admin || Community_User) Since ___ Users -> add --> Products (1:N) Products -> are associated with --> Wished_Products (1:N) Products -> are grouped by --> Categories (N:1) Products -> are classified by --> Types (N:1) Products -> are defined by --> Sizes (N:1) --- ## Entities ### --> User User_Id: UUID User_Username: string User_Picture: string (url) User_FirstName: string User_LastName: string User_Email: string User_Password: string User_CreatedAt: date / Timestamp ### --> Product Product_Id: UUID Product_Name: string Product_Picture: string (url) Product_Description: string (text) Product_CreatedAt: date / Timestamp Product_Transaction: string (Donate || Exchange) User_Id: UUID ### --> Community Community_Id: UUID Community_Name: string Community_Picture: string (url) Community_Description: string (text) Community_CreatedAt: date / Timestamp ### --> Membership Membership_Id: UUID Membership_Role: string (Community_admin || Community_User) Membership_Since: date / Timestamp Community_Id: UUID User_Id: UUID ### --> Category (for products) Category_Id: UUID Category_Name: string Category_Description: string Category_CreatedAt: date / Timestamp ### --> Category_Products (join) Product_Id: UUID (Community_Id. Foreign key from Entity Product.) Category_Id: UUID (Category_Id. Foreign key from Entity Category.) ___ ## Entities relationships ### User-Product (1:N) - **Relation:** "adds" - **Description:** A user can add zero, one or many products information cards. Each product is added by only one user. - **Implementation:** Table `Product` includes a foreign key `User_Id` which refers to primary key `User_Id` from table `User`. ### User-Community (1:N) - **Relation:** "creates" - **Description:** A user can create zero, one or many communities. Each community is added by only one user. *Note:* When a user creates a community, he automatically has a membership from this community with an admin role. - **Implementation:** Table `Community` include a foreign key `User_Id` which refers to primary key `User_Id` from table `User`. ### User-Membership (1:N) - **Relation:** "has" - **Description:** A user has zero, one or many memberships. *Note:* A membership has a role assigned. As an admin or member. - **Implementation:** Table `Membership` include a foreign key `User_Id` which refers to primary key `User_Id` from table `User`. ### Community-Membership (1:N) - **Relation:** "has" - **Description for member:** A community has one or many membership. - **Implementation:** Table `Membership` include a foreign key `Community` which refers to primary key `Community_Id` from table `Community`. ### Product-Category (N:M) - **Relation:** "categorized in" - **Description:** A`Product` must be categorized. It must be at least associated with one `Category`. It can also be associated with many `Category`. - **Implementation:** Table `Category_Products` make the junction to deal with the relation many to many. It contains two foreign keys : `Category_Id` from `Category` and `Product_Id` from `Product`. ### Category-Category_Products (1:N) - **Relation:** "groups" - **Description:** A category can gathered /* compléter */ - **Implementation:** /* compléter */ --- ## Entities representation ```mermaid erDiagram User ||--o{ Product : "adds" User ||--o{ Membership : "has" User ||--o{ Community : "creates" Community ||--|{ Membership : "has" Product ||--|{ Category_Products : "categorized in" Category ||--|{ Category_Products : "groups" User { UUID User_Id string User_Username string User_Picture string User_FirstName string User_LastName string User_Email string User_Password date User_CreatedAt } Product { UUID Product_Id string Product_Name string Product_Picture string Product_Description string Product_Transaction date Product_CreatedAt UUID User_Id } Community { UUID Community_Id string Community_Name string Community_Picture string Community_Description date Community_CreatedAt } Membership { UUID Membership_Id string Membership_Role date Membership_Since UUID User_Id UUID Community_Id } Category { UUID Category_Id string Category_Name string Category_Description date Category_CreatedAt } Category_Products { UUID Product_Id UUID Category_Id } ``` | Value (left) | Value (right) | Meaning | |--------------|---------------|------------------------------| | \|o | o\| | Zero or one | | \| \| | \| \| | Exactly one | | }o | o\{ | Zero or more (no upper limit)| | }\| | \|\{ | One or more (no upper limit) | --- Création d'un compte utilisateur ```mermaid sequenceDiagram actor U as Utilisateur participant UI as Interface Utilisateur participant S as Serveur participant DB as Base de Données U->>UI: Choix de créer un compte UI->>S: Demande de création de compte avec email et mot de passe S->>DB: Vérifie si l'email existe déjà alt L'email existe déjà DB->>S: Email déjà utilisé S->>UI: Affiche erreur d'email déjà utilisé UI->>U: Affiche erreur d'email déjà utilisé else L'email est unique DB->>S: Email unique confirmé S->>S: Hache le mot de passe S->>DB: Crée le nouvel utilisateur DB->>S: Confirmation de création de l'utilisateur S->>UI: Utilisateur créé avec succès UI->>U: Affiche succès de création de compte end ``` Connexion au compte utilisateur ```mermaid sequenceDiagram actor U as Utilisateur participant UI as Interface Utilisateur participant S as Serveur participant DB as Base de Données U->>UI: Choix de se connecter UI->>S: Entre mail et mot de passe de connexion S->>DB: Vérifie si l'email existe déjà alt L'email existe déjà DB->>S: Email déjà utilisé S->>UI: Affiche erreur d'email déjà utilisé UI->>U: Affiche erreur d'email déjà utilisé else L'email est unique DB->>S: Email unique confirmé S->>S: Hache le mot de passe S->>DB: Crée le nouvel utilisateur DB->>S: Confirmation de création de l'utilisateur S->>UI: Utilisateur créé avec succès UI->>U: Affiche succès de création de compte end ``` Création de produit --> pres ```mermaid sequenceDiagram actor U as Utilisateur participant A as Application participant DB as Base de Données U->>A: Crée une fiche produit (brouillon) A->>DB: Sauvegarde le brouillon DB-->>A: Confirme la sauvegarde A-->>U: Affiche le produit sauvegardé U->>A: Publie le produit A->>DB: Vérifie la catégorie du produit DB-->>A: Catégorie confirmée A->>DB: Change le statut en 'Publié' DB-->>A: Confirme la publication A-->>U: Affiche le produit publié ``` A affiner ```mermaid sequenceDiagram actor U as Utilisateur participant A as Application participant DB as Base de Données U->>A: Sélectionne un produit A->>DB: Sauvegarde le brouillon DB-->>A: Confirme la sauvegarde A-->>U: Affiche le produit sauvegardé U->>A: Publie le produit A->>DB: Vérifie la catégorie du produit DB-->>A: Catégorie confirmée A->>DB: Change le statut en 'Publié' DB-->>A: Confirme la publication A-->>U: Affiche le produit publié ``` --- ## User stories -> Je m'inscris * -> Je me connecte -> Je me déconnecte -> Je mets à jour mon profil -> J'ajoute un article * -> Je supprime un article -> J'échange ou récupère (don) un article -> J'échange ou donne un article -> Je cherche un article dans toute la base -> Je cherche un article parmi mes communautés -> Je créé une communauté -> J'administre une communauté -> Je rejoins une communauté -> Je consulte une fiche communauté -> Je consulte une fiche membre ___ ### oral en anglais : 10 minutes pas plus - faire une introduction de son parcours - synthèse de l'application : le pitch de l'appli Nooky application allows you to create or join virtual communities in order to get, give or exchange products from members of your communities. - ce que l'on a fait jusqu'à présent > wireframe (à faire) > entities (fait) > entities relationships (fait) > MCD (fait) > UML (à faire) > choix de la stack (fait) - wireframe > à faire - une présentation de ce que l'on a fait sur les entités > entities (fait) > entities relationships (fait) > MCD (fait) - présentation des règles métiers > UML - présentation et argumentation stack technique > front: ReactJS > back: Java + spring ? > BDD: PostgresSQL ___ Points à travailler - comment gérer la transmission des infos membre pour les envois de colis ? - comment gérer les paiements pour l'envoi des colis ? (paypal seulement ?) -- La Stack : SvelteKit (TypeScript) : SvelteKit est un framework moderne pour la construction d'applications web, offrant des performances optimisées et une syntaxe déclarative. L'utilisation de TypeScript avec SvelteKit ajoute des avantages en termes de sécurité et de maintenabilité grâce à la vérification statique des types. Java avec Spring Boot : Java avec Spring Boot est un choix populaire pour le développement back-end, offrant une grande robustesse, une bonne gestion de la concurrence et une large communauté de support. Spring Boot simplifie le développement en fournissant des fonctionnalités prêtes à l'emploi et en favorisant les bonnes pratiques de développement. PostgreSQL : PostgreSQL est l'un des systèmes de gestion de base de données relationnelle les plus avancés et les plus performants disponibles. Il offre des fonctionnalités avancées telles que la prise en charge des transactions ACID, les index avancés, etc. PostgreSQL est bien adapté aux applications nécessitant des fonctionnalités avancées de gestion des données et une évolutivité robuste.