Skip to content

Commit 0e190cc

Browse files
committed
feat(model): AIModel ve Provider sınıfları eklendi; AIModelRepository ve ProviderRepository güncellendi
1 parent ce1db9b commit 0e190cc

File tree

9 files changed

+130
-87
lines changed

9 files changed

+130
-87
lines changed

user-service/src/main/java/com/craftpilot/userservice/dto/ai/ModelResponse.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import lombok.Builder;
77
import lombok.Data;
88
import lombok.NoArgsConstructor;
9+
910
import java.util.List;
1011

1112
@Data

user-service/src/main/java/com/craftpilot/userservice/dto/ai/ModelsData.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import lombok.Builder;
77
import lombok.Data;
88
import lombok.NoArgsConstructor;
9+
910
import java.util.List;
1011

1112
@Data
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package com.craftpilot.userservice.model;
2+
3+
import com.fasterxml.jackson.annotation.JsonIgnore;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
import org.springframework.data.annotation.Id;
8+
import org.springframework.data.mongodb.core.index.Indexed;
9+
import org.springframework.data.mongodb.core.mapping.Document;
10+
11+
import java.time.LocalDateTime;
12+
13+
@Data
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
@Document(collection = "ai_models")
17+
public class AIModel {
18+
19+
@Id
20+
private String id;
21+
22+
@Indexed(unique = true)
23+
private String modelId;
24+
25+
private String modelName;
26+
private String provider;
27+
28+
@JsonIgnore
29+
private String providerId;
30+
31+
private int maxInputTokens;
32+
private String requiredPlan;
33+
private int creditCost;
34+
private String creditType;
35+
private String category;
36+
private int contextLength;
37+
private boolean active = true;
38+
private LocalDateTime createdAt;
39+
private LocalDateTime updatedAt;
40+
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.craftpilot.userservice.model;
2+
3+
import lombok.AllArgsConstructor;
4+
import lombok.Builder;
5+
import lombok.Data;
6+
import lombok.NoArgsConstructor;
7+
import org.springframework.data.annotation.Id;
8+
import org.springframework.data.mongodb.core.index.Indexed;
9+
import org.springframework.data.mongodb.core.mapping.Document;
10+
11+
import java.time.LocalDateTime;
12+
import java.util.List;
13+
14+
@Data
15+
@Builder
16+
@NoArgsConstructor
17+
@AllArgsConstructor
18+
@Document(collection = "providers")
19+
public class Provider {
20+
21+
@Id
22+
private String id;
23+
24+
@Indexed(unique = true)
25+
private String name;
26+
27+
private String description;
28+
private String logoUrl;
29+
private boolean active;
30+
private LocalDateTime createdAt;
31+
private LocalDateTime updatedAt;
32+
33+
// Add missing field to store models
34+
private List<AIModel> models;
35+
}

user-service/src/main/java/com/craftpilot/userservice/repository/AIModelRepository.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88

99
@Repository
1010
public interface AIModelRepository extends ReactiveMongoRepository<AIModel, String> {
11-
Flux<AIModel> findByCategory(String category);
12-
13-
Flux<AIModel> findByRequiredPlan(String plan);
14-
1511
Mono<AIModel> findByModelId(String modelId);
12+
Flux<AIModel> findByProvider(String provider);
13+
Flux<AIModel> findByCategory(String category);
1614
}

user-service/src/main/java/com/craftpilot/userservice/repository/ProviderRepository.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
import com.craftpilot.userservice.model.ai.Provider;
44
import org.springframework.data.mongodb.repository.ReactiveMongoRepository;
55
import org.springframework.stereotype.Repository;
6-
import reactor.core.publisher.Flux;
76
import reactor.core.publisher.Mono;
87

98
@Repository
109
public interface ProviderRepository extends ReactiveMongoRepository<Provider, String> {
11-
// Provider'ları bulmak için ek metotlar buraya eklenebilir
1210
Mono<Provider> findByName(String name);
1311
}

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

Lines changed: 18 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,9 @@
99
import lombok.RequiredArgsConstructor;
1010
import lombok.extern.slf4j.Slf4j;
1111
import org.springframework.stereotype.Service;
12-
import reactor.core.publisher.Flux;
1312
import reactor.core.publisher.Mono;
1413

1514
import java.util.ArrayList;
16-
import java.util.HashMap;
1715
import java.util.List;
1816
import java.util.Map;
1917
import java.util.stream.Collectors;
@@ -42,7 +40,9 @@ public Mono<ModelsData> getAvailableModels(String userPlan) {
4240
}
4341

4442
// Kredi tipi aynıysa, kredi maliyetine göre sırala (küçükten büyüğe)
45-
return model1.getCreditCost().compareTo(model2.getCreditCost());
43+
return Integer.compare(
44+
model1.getCreditCost() != null ? model1.getCreditCost() : 0,
45+
model2.getCreditCost() != null ? model2.getCreditCost() : 0);
4646
});
4747

4848
// Provider'ları getir
@@ -73,6 +73,19 @@ public Mono<ModelsData> getAvailableModels(String userPlan) {
7373
.doOnError(e -> log.error("AI modelleri getirilirken hata: error={}", e.getMessage()));
7474
}
7575

76+
// Helper method to compare credit types
77+
private int compareCreditTypes(String type1, String type2) {
78+
if (type1 == null) return type2 == null ? 0 : 1;
79+
if (type2 == null) return -1;
80+
81+
if ("STANDARD".equals(type1) && "ADVANCED".equals(type2)) {
82+
return -1;
83+
} else if ("ADVANCED".equals(type1) && "STANDARD".equals(type2)) {
84+
return 1;
85+
}
86+
return 0;
87+
}
88+
7689
public ModelsData getDefaultModels(String userPlan, Throwable t) {
7790
log.warn("Varsayılan AI modeller döndürülüyor (fallback): userPlan={}, error={}", userPlan, t.getMessage());
7891

@@ -90,8 +103,8 @@ public ModelsData getDefaultModels(String userPlan, Throwable t) {
90103
List<Provider> defaultProviders = new ArrayList<>();
91104
defaultProviders.add(Provider.builder()
92105
.name("Google")
93-
.icon("TbBrandGoogle")
94-
.description("Gemini serisi modeller")
106+
.description("Google AI models")
107+
.active(true)
95108
.models(defaultModels)
96109
.build());
97110

@@ -100,57 +113,4 @@ public ModelsData getDefaultModels(String userPlan, Throwable t) {
100113
.providers(defaultProviders)
101114
.build();
102115
}
103-
104-
public String getDefaultModelForPlan(String userPlan) {
105-
switch(userPlan.toLowerCase()) {
106-
case "premium":
107-
case "enterprise":
108-
return "google/gemini-2.0-pro-001";
109-
case "pro":
110-
return "google/gemini-2.0-pro-001";
111-
case "free":
112-
default:
113-
return "google/gemini-2.0-flash-lite-001";
114-
}
115-
}
116-
117-
private Mono<List<AIModel>> filterModelsByPlan(String userPlan) {
118-
log.info("Tüm AI modeller getiriliyor (filtreleme yapılmadan)");
119-
return modelRepository.findAll().collectList();
120-
}
121-
122-
private String mapLegacyModelId(String modelId) {
123-
// Eski ID'den yeni ID'ye eşleme
124-
Map<String, String> modelMappings = new HashMap<>();
125-
modelMappings.put("gemini-pro", "google/gemini-1.5-pro");
126-
modelMappings.put("gpt-4-turbo", "openai/gpt-4-turbo");
127-
128-
// Eşleşen bir eski ID varsa yeni ID'yi döndür, yoksa orijinal ID'yi kullan
129-
return modelMappings.getOrDefault(modelId, modelId);
130-
}
131-
132-
public Mono<AIModel> saveModel(AIModel model) {
133-
log.info("AI Model kaydediliyor: modelId={}", model.getModelId());
134-
return modelRepository.save(model);
135-
}
136-
137-
public Flux<AIModel> saveAllModels(List<AIModel> models) {
138-
log.info("{} AI model kaydediliyor", models.size());
139-
return Flux.fromIterable(models)
140-
.flatMap(this::saveModel);
141-
}
142-
143-
// Kredi tipi karşılaştırma yardımcı metodu
144-
private int compareCreditTypes(String creditType1, String creditType2) {
145-
// "STANDARD" < "ADVANCED" olacak şekilde sırala
146-
if (creditType1 == null && creditType2 == null) return 0;
147-
if (creditType1 == null) return -1; // null değerler başta olsun
148-
if (creditType2 == null) return 1;
149-
150-
// STANDARD önce, ADVANCED sonra
151-
if ("STANDARD".equals(creditType1) && "ADVANCED".equals(creditType2)) return -1;
152-
if ("ADVANCED".equals(creditType1) && "STANDARD".equals(creditType2)) return 1;
153-
154-
return 0;
155-
}
156116
}

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

Lines changed: 20 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -235,19 +235,8 @@ private void validateModels(List<ModelDTO> models) {
235235
}
236236

237237
if (!isValid) {
238-
log.warn("Geçersiz model verisi: {} - {}", model.modelId, errors.toString());
239-
invalidModels++;
240-
invalidModelIds.add(model.modelId);
241-
}
242-
}
243-
244-
if (invalidModels > 0) {
245-
log.warn("{} model geçersiz veri içeriyor: {}", invalidModels, String.join(", ", invalidModelIds));
246-
247-
// Kritik doğrulama başarısız olursa işlemi durdur
248-
if (invalidModels > models.size() * 0.2) { // %20'den fazla model geçersizse
249-
throw new IllegalArgumentException("Model dosyasında çok fazla geçersiz veri bulundu: " +
250-
invalidModels + " / " + models.size());
238+
// Log error or handle invalid model
239+
log.error("Model validation failed: {}", errors.toString());
251240
}
252241
}
253242

@@ -351,12 +340,7 @@ private Mono<Map<String, Provider>> saveProvidersReactive(List<ModelDTO> modelDT
351340
continue;
352341
}
353342

354-
Provider newProvider = Provider.builder()
355-
.name(providerName)
356-
.active(true)
357-
.createdAt(LocalDateTime.now())
358-
.updatedAt(LocalDateTime.now())
359-
.build();
343+
Provider newProvider = createProvider(providerName, null);
360344

361345
newProviders.add(newProvider);
362346
log.info("Yeni provider hazırlanıyor: {}", newProvider.getName());
@@ -375,12 +359,12 @@ private Mono<Map<String, Provider>> saveProvidersReactive(List<ModelDTO> modelDT
375359
// Önce yeni provider'ları kaydet
376360
Mono<List<Provider>> saveNewProvidersMono = newProviders.isEmpty() ?
377361
Mono.just(Collections.emptyList()) :
378-
providerRepository.saveAll(newProviders).collectList();
362+
Flux.fromIterable(newProviders).flatMap(providerRepository::save).collectList();
379363

380364
// Sonra güncellenen provider'ları kaydet
381365
Mono<List<Provider>> updateProvidersMono = updatedProviders.isEmpty() ?
382366
Mono.just(Collections.emptyList()) :
383-
providerRepository.saveAll(updatedProviders).collectList();
367+
Flux.fromIterable(updatedProviders).flatMap(providerRepository::save).collectList();
384368

385369
// Her iki işlemi de tamamla ve providerMap'i döndür
386370
return saveNewProvidersMono.flatMap(savedNewProviders -> {
@@ -517,7 +501,8 @@ class ModelCounter {
517501
counter.errorCount, counter.skippedCount, counter.invalidProviderCount);
518502

519503
// Modelleri toplu olarak kaydet, daha verimli
520-
return aiModelRepository.saveAll(modelsToSave)
504+
return Flux.fromIterable(modelsToSave)
505+
.flatMap(aiModelRepository::save)
521506
.collectList()
522507
.map(savedModels -> {
523508
log.info("{} model başarıyla kaydedildi", savedModels.size());
@@ -590,4 +575,17 @@ public Map<String, Object> getModelLoadingStatus() {
590575
status.put("lastLoadedModelCount", lastLoadedModelCount);
591576
return status;
592577
}
578+
579+
/**
580+
* Provider oluşturma işlemini gerçekleştiren yardımcı metod
581+
*/
582+
private Provider createProvider(String name, String description) {
583+
return Provider.builder()
584+
.name(name)
585+
.description(description)
586+
.active(true)
587+
.createdAt(LocalDateTime.now())
588+
.updatedAt(LocalDateTime.now())
589+
.build();
590+
}
593591
}

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -112,7 +112,19 @@ private void applyUpdates(UserPreference preferences, Map<String, Object> update
112112
break;
113113
case "aiModelFavorites":
114114
if (value instanceof List) {
115-
preferences.setAiModelFavorites((List<String>) value);
115+
List<?> rawList = (List<?>) value;
116+
List<String> validatedList = rawList.stream()
117+
.filter(item -> item instanceof String)
118+
.map(item -> (String) item)
119+
.filter(s -> s != null && !s.trim().isEmpty())
120+
.distinct()
121+
.collect(Collectors.toList());
122+
123+
preferences.setAiModelFavorites(validatedList);
124+
if (validatedList.size() != rawList.size()) {
125+
log.warn("aiModelFavorites listesinde geçersiz öğeler filtrelendi. Orijinal: {}, Filtrelenmiş: {}",
126+
rawList.size(), validatedList.size());
127+
}
116128
}
117129
break;
118130
case "notifications":

0 commit comments

Comments
 (0)