refactor: use stateless identity fallback
This commit is contained in:
@@ -0,0 +1,34 @@
|
||||
package com.lingniu.ingest.identity;
|
||||
|
||||
/**
|
||||
* Stateless production fallback used when a caller has no injected identity service.
|
||||
*
|
||||
* <p>Persistent binding belongs to {@link MySqlVehicleIdentityService}; this resolver only keeps
|
||||
* ingestion flowing with explicit VIN or stable external identifiers.
|
||||
*/
|
||||
public final class StatelessVehicleIdentityResolver implements VehicleIdentityResolver {
|
||||
|
||||
@Override
|
||||
public VehicleIdentity resolve(VehicleIdentityLookup lookup) {
|
||||
if (lookup == null) {
|
||||
return unknown();
|
||||
}
|
||||
if (!lookup.vin().isBlank()) {
|
||||
return new VehicleIdentity(lookup.vin(), true, VehicleIdentitySource.EXPLICIT_VIN);
|
||||
}
|
||||
if (!lookup.deviceId().isBlank()) {
|
||||
return new VehicleIdentity(lookup.deviceId(), false, VehicleIdentitySource.FALLBACK_DEVICE_ID);
|
||||
}
|
||||
if (!lookup.phone().isBlank()) {
|
||||
return new VehicleIdentity(lookup.phone(), false, VehicleIdentitySource.FALLBACK_PHONE);
|
||||
}
|
||||
if (!lookup.plate().isBlank()) {
|
||||
return new VehicleIdentity(lookup.plate(), false, VehicleIdentitySource.FALLBACK_PLATE);
|
||||
}
|
||||
return unknown();
|
||||
}
|
||||
|
||||
private static VehicleIdentity unknown() {
|
||||
return new VehicleIdentity("unknown", false, VehicleIdentitySource.UNKNOWN);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
package com.lingniu.ingest.identity;
|
||||
|
||||
import com.lingniu.ingest.api.ProtocolId;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
import static org.assertj.core.api.Assertions.assertThat;
|
||||
|
||||
class StatelessVehicleIdentityResolverTest {
|
||||
|
||||
private final StatelessVehicleIdentityResolver resolver = new StatelessVehicleIdentityResolver();
|
||||
|
||||
@Test
|
||||
void explicitVinWinsWithoutPersistingAnyBinding() {
|
||||
VehicleIdentity identity = resolver.resolve(new VehicleIdentityLookup(
|
||||
ProtocolId.MQTT_YUTONG, "LNVIN000000000001", "13900000000", "DEV001", "粤B12345"));
|
||||
|
||||
assertThat(identity.vin()).isEqualTo("LNVIN000000000001");
|
||||
assertThat(identity.resolved()).isTrue();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.EXPLICIT_VIN);
|
||||
}
|
||||
|
||||
@Test
|
||||
void fallsBackToStableExternalIdentifiersWithoutMarkingResolved() {
|
||||
assertThat(resolver.resolve(new VehicleIdentityLookup(
|
||||
ProtocolId.JT808, "", "13900000001", "DEV001", "粤B12345")))
|
||||
.satisfies(identity -> {
|
||||
assertThat(identity.vin()).isEqualTo("DEV001");
|
||||
assertThat(identity.resolved()).isFalse();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.FALLBACK_DEVICE_ID);
|
||||
});
|
||||
|
||||
assertThat(resolver.resolve(new VehicleIdentityLookup(
|
||||
ProtocolId.JT808, "", "13900000001", "", "粤B12345")))
|
||||
.satisfies(identity -> {
|
||||
assertThat(identity.vin()).isEqualTo("13900000001");
|
||||
assertThat(identity.resolved()).isFalse();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.FALLBACK_PHONE);
|
||||
});
|
||||
|
||||
assertThat(resolver.resolve(new VehicleIdentityLookup(
|
||||
ProtocolId.JT808, "", "", "", "粤B12345")))
|
||||
.satisfies(identity -> {
|
||||
assertThat(identity.vin()).isEqualTo("粤B12345");
|
||||
assertThat(identity.resolved()).isFalse();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.FALLBACK_PLATE);
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void returnsUnknownWhenNoIdentitySignalExists() {
|
||||
VehicleIdentity identity = resolver.resolve(new VehicleIdentityLookup(ProtocolId.JT808, "", "", "", ""));
|
||||
|
||||
assertThat(identity.vin()).isEqualTo("unknown");
|
||||
assertThat(identity.resolved()).isFalse();
|
||||
assertThat(identity.source()).isEqualTo(VehicleIdentitySource.UNKNOWN);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user