refactor: use stateless identity fallback

This commit is contained in:
lingniu
2026-07-01 02:58:38 +08:00
parent 1ce4f80161
commit 7a245215b8
7 changed files with 111 additions and 12 deletions

View File

@@ -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);
}
}

View File

@@ -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);
}
}