Application de Gestion de Notes Multi-Plateforme
Application de Gestion de Notes Multi-Plateforme
-
Architecture du Projet
-
Implémentation Backend (Spring Boot)
-
Configuration des dépendances (pom.xml)
-
Modèles de données
User.java
Note.java
-
Authentification JWT
JwtAuthenticationFilter.java
-
Configuration des dépendances (pom.xml)
-
notes-app/
├── backend/# API Spring Boot
│ ├── src/main/java/com/notes/
│ │ ├── controller/ # Contrôleurs REST
│ │ ├── service/ # Logique métier
│ │ ├── repository/ # Accès aux données
│ │ ├── model/ # Entités JPA
│ │ ├── security/ # Configuration JWT
│ │ └── dto/ # Objets de transfert
│ ├── src/main/resources/
│ │ ├── application.properties
│ │ └── data.sql # Données initiales
│ ├── Dockerfile
│ └── pom.xml
├── frontend/ # Application Flutter
│ ├── lib/
│ │ ├── models/ # Modèles de données
│ │ ├── services/ # Services API et base locale
│ │ ├── providers/ # State management
│ │ ├── screens/ # Écrans de l’application
│ │ ├── widgets/ # Composants réutilisables
│ │ └── utils/ # Utilitaires
│ ├── assets/
│ ├── pubspec.yaml
│ └── Dockerfile
├── docker-compose.yml # Configuration multi-conteneurs
└── README.md # Documentation
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-api</artifactId>
<version>0.11.5</version>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-impl</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt-jackson</artifactId>
<version>0.11.5</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(unique = true, nullable = false)
private String email;
@Column(nullable = false)
private String passwordHash;
private LocalDateTime createdAt;
// Getters and setters
}
@Entity
@Table(name = "notes")
public class Note {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false)
private String title;
@Column(columnDefinition = "TEXT")
private String contentMd;
@Enumerated(EnumType.STRING)
private Visibility visibility = Visibility.PRIVATE;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;
@ManyToOne
@JoinColumn(name = "owner_id", nullable = false)
private User owner;
@ManyToMany
@JoinTable(
name = "note_tags",
joinColumns = @JoinColumn(name = "note_id"),
inverseJoinColumns = @JoinColumn(name = "tag_id")
)
private Set tags = new HashSet<>();
// Getters and setters
}
public enum Visibility {
PRIVATE, SHARED, PUBLIC
}
public class JwtAuthenticationFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request,
HttpServletResponse response,
FilterChain filterChain)
throws ServletException, IOException {
try {
String jwt = getJwtFromRequest(request);
if (StringUtils.hasText(jwt) && jwtTokenProvider.validateToken(jwt)) {
Long userId = jwtTokenProvider.getUserIdFromJWT(jwt);
UserDetails userDetails = customUserDetailsService.loadUserById(userId);
UsernamePasswordAuthenticationToken authentication =
new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
authentication.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));
SecurityContextHolder.getContext().setAuthentication(authentication);
}
} catch (Exception ex) {
logger.error("Could not set user authentication in security context", ex);
}
filterChain.doFilter(request, response);
}
private String getJwtFromRequest(HttpServletRequest request) {
String bearerToken = request.getHeader("Authorization");
if (StringUtils.hasText(bearerToken) && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7);
}
return null;
}
}