Skip to content

Commit 564b746

Browse files
committed
feat(model): modelId alanı anahtar olarak güncellendi; ModelDataLoader'da sağlayıcı yönetimi eklendi; ModelDataFixer sınıfı eklendi
1 parent e23c85f commit 564b746

File tree

4 files changed

+143
-46
lines changed

4 files changed

+143
-46
lines changed

user-service/src/main/java/com/craftpilot/userservice/model/ai/AIModel.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,7 @@
1414
@Document(collection = "ai_models")
1515
public class AIModel {
1616
@Id
17-
private String id;
18-
private String modelId;
17+
private String modelId; // Now using modelId as the primary key
1918
private String modelName;
2019
private String provider;
2120
private Integer maxInputTokens;

user-service/src/main/java/com/craftpilot/userservice/service/ModelDataLoader.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,9 @@
2121
import java.nio.file.Path;
2222
import java.nio.file.Paths;
2323
import java.util.ArrayList;
24+
import java.util.HashMap;
2425
import java.util.List;
26+
import java.util.Map;
2527
import java.util.concurrent.atomic.AtomicInteger;
2628

2729
@Service
@@ -109,6 +111,9 @@ private Mono<Integer> processJsonContent(String jsonContent) {
109111
AtomicInteger modelCount = new AtomicInteger(0);
110112
List<Mono<Void>> processTasks = new ArrayList<>();
111113

114+
// Create a map to collect all providers from models
115+
Map<String, Provider> providerMap = new HashMap<>();
116+
112117
for (Object obj : jsonObjects) {
113118
try {
114119
// Her bir JSON objesini ayrı ayrı değerlendir
@@ -248,6 +253,22 @@ else if (itemMap.containsKey("id") && itemMap.containsKey("modelId")) {
248253
}
249254
}
250255

256+
// Now save all collected providers
257+
for (Provider provider : providerMap.values()) {
258+
Mono<Void> providerTask = providerRepository.save(provider)
259+
.onErrorResume(e -> {
260+
if (e instanceof org.springframework.dao.DuplicateKeyException) {
261+
log.info("Provider '{}' zaten var, yeniden kullanılıyor", provider.getName());
262+
return Mono.empty();
263+
}
264+
log.error("Provider kaydedilirken hata: {}", e.getMessage());
265+
return Mono.error(e);
266+
})
267+
.then();
268+
269+
processTasks.add(providerTask);
270+
}
271+
251272
if (processTasks.isEmpty()) {
252273
log.warn("İşlenecek model bulunamadı");
253274
return Mono.just(0);
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
package com.craftpilot.userservice.util;
2+
3+
import com.craftpilot.userservice.model.ai.AIModel;
4+
import com.craftpilot.userservice.model.ai.Provider;
5+
import com.craftpilot.userservice.repository.AIModelRepository;
6+
import com.craftpilot.userservice.repository.ProviderRepository;
7+
import lombok.RequiredArgsConstructor;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.boot.CommandLineRunner;
10+
import org.springframework.context.annotation.Profile;
11+
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
12+
import org.springframework.data.mongodb.core.query.Criteria;
13+
import org.springframework.data.mongodb.core.query.Query;
14+
import org.springframework.data.mongodb.core.query.Update;
15+
import org.springframework.stereotype.Component;
16+
import reactor.core.publisher.Flux;
17+
import reactor.core.publisher.Mono;
18+
19+
import java.util.*;
20+
21+
/**
22+
* Utility class to fix model data structure issues.
23+
* Only runs when the "fix-models" profile is active.
24+
*/
25+
@Component
26+
@RequiredArgsConstructor
27+
@Slf4j
28+
@Profile("fix-models")
29+
public class ModelDataFixer implements CommandLineRunner {
30+
31+
private final ReactiveMongoTemplate mongoTemplate;
32+
private final AIModelRepository modelRepository;
33+
private final ProviderRepository providerRepository;
34+
35+
@Override
36+
public void run(String... args) throws Exception {
37+
log.info("Running model data fixer...");
38+
39+
// Fix models with redundant _id and id fields
40+
fixModelStructure()
41+
.then(ensureProvidersExist())
42+
.doOnSuccess(v -> log.info("Model data fixing completed successfully"))
43+
.doOnError(e -> log.error("Error fixing model data: {}", e.getMessage(), e))
44+
.block();
45+
}
46+
47+
private Mono<Void> fixModelStructure() {
48+
log.info("Fixing model structure...");
49+
50+
return mongoTemplate.find(new Query(), AIModel.class)
51+
.flatMap(model -> {
52+
// Check if this is a model with the old structure
53+
if (model.getModelId() == null) {
54+
log.warn("Model has null modelId: {}", model);
55+
return Mono.empty();
56+
}
57+
58+
// Create a new AIModel with the correct structure
59+
AIModel fixedModel = new AIModel();
60+
fixedModel.setModelId(model.getModelId());
61+
fixedModel.setModelName(model.getModelName());
62+
fixedModel.setProvider(model.getProvider());
63+
fixedModel.setMaxInputTokens(model.getMaxInputTokens());
64+
fixedModel.setRequiredPlan(model.getRequiredPlan());
65+
fixedModel.setCreditCost(model.getCreditCost());
66+
fixedModel.setCreditType(model.getCreditType());
67+
fixedModel.setCategory(model.getCategory());
68+
fixedModel.setContextLength(model.getContextLength());
69+
fixedModel.setDefaultTemperature(model.getDefaultTemperature());
70+
fixedModel.setIcon(model.getIcon());
71+
fixedModel.setDescription(model.getDescription());
72+
fixedModel.setFee(model.getFee());
73+
fixedModel.setFeatured(model.getFeatured());
74+
fixedModel.setMaxTokens(model.getMaxTokens());
75+
fixedModel.setMultimodal(model.getMultimodal());
76+
fixedModel.setActive(model.getActive());
77+
78+
return modelRepository.save(fixedModel)
79+
.doOnSuccess(saved -> log.info("Fixed model: {}", saved.getModelId()))
80+
.onErrorResume(e -> {
81+
log.error("Error fixing model {}: {}", model.getModelId(), e.getMessage());
82+
return Mono.empty();
83+
});
84+
})
85+
.then();
86+
}
87+
88+
private Mono<Void> ensureProvidersExist() {
89+
log.info("Ensuring providers exist...");
90+
91+
// Get all unique provider names from models
92+
return modelRepository.findAll()
93+
.map(AIModel::getProvider)
94+
.filter(Objects::nonNull)
95+
.distinct()
96+
.collectList()
97+
.flatMapMany(providerNames -> {
98+
log.info("Found {} unique providers in models", providerNames.size());
99+
100+
// For each provider name, ensure a Provider entity exists
101+
return Flux.fromIterable(providerNames)
102+
.flatMap(providerName -> {
103+
return providerRepository.findById(providerName)
104+
.switchIfEmpty(Mono.defer(() -> {
105+
Provider provider = Provider.builder()
106+
.name(providerName)
107+
.description("Provider for " + providerName + " models")
108+
.build();
109+
110+
log.info("Creating missing provider: {}", providerName);
111+
return providerRepository.save(provider);
112+
}));
113+
});
114+
})
115+
.then();
116+
}
117+
}

0 commit comments

Comments
 (0)