package me.belkacemi.iotalarm.domain.model; import java.util.regex.Pattern; /** * Value Object identifiant un capteur physique. * *

Dans le studio il n'y en a qu'un : {@code iphone-biblio}, un vieil iPhone * recyclé, calé entre deux livres de la bibliothèque.

* *

L'identifiant est contraint dès la construction. Le domaine refuse les * données invalides à sa frontière, il n'a donc jamais à s'en méfier ensuite.

*/ public record DeviceId(String value) { private static final Pattern VALID = Pattern.compile("^[a-z0-9][a-z0-9-]{1,62}[a-z0-9]$"); public DeviceId { if (value == null || value.isBlank()) { throw new IllegalArgumentException("L'identifiant de capteur est obligatoire"); } value = value.trim().toLowerCase(); if (!VALID.matcher(value).matches()) { throw new IllegalArgumentException( "Identifiant de capteur invalide : '" + value + "' (minuscules, chiffres et tirets, 3 a 64 caracteres)"); } } public static DeviceId of(String value) { return new DeviceId(value); } /** Libelle lisible affiche dans la console : {@code iphone-biblio} -> {@code "Iphone Biblio"}. */ public String displayName() { StringBuilder sb = new StringBuilder(value.length()); for (String part : value.split("-")) { if (part.isEmpty()) { continue; } if (!sb.isEmpty()) { sb.append(' '); } sb.append(Character.toUpperCase(part.charAt(0))).append(part.substring(1)); } return sb.toString(); } @Override public String toString() { return value; } }