Skip to content

Commit 55e2147

Browse files
committed
AI model yönetimi için yeni API'ler eklendi; kullanıcı planına göre uygun AI modellerini getiren endpoint oluşturuldu. Kullanıcı tercihleri ve model bilgileri güncellendi.
1 parent 04b1ca7 commit 55e2147

15 files changed

Lines changed: 346 additions & 0 deletions

user-service/pom.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,7 @@
213213
<groupId>org.springframework.boot</groupId>
214214
<artifactId>spring-boot-maven-plugin</artifactId>
215215
<configuration>
216+
<mainClass>com.craftpilot.userservice.UserServiceApplication</mainClass>
216217
<excludes>
217218
<exclude>
218219
<groupId>org.projectlombok</groupId>
Lines changed: 64 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
package com.craftpilot.userservice.controller;
2+
3+
import com.craftpilot.userservice.dto.ai.ModelResponse;
4+
import com.craftpilot.userservice.service.AIModelService;
5+
import com.craftpilot.userservice.service.UserService;
6+
import io.swagger.v3.oas.annotations.Operation;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
8+
import lombok.RequiredArgsConstructor;
9+
import lombok.extern.slf4j.Slf4j;
10+
import org.springframework.http.ResponseEntity;
11+
import org.springframework.security.core.Authentication;
12+
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
13+
import org.springframework.security.core.context.SecurityContext;
14+
import org.springframework.web.bind.annotation.GetMapping;
15+
import org.springframework.web.bind.annotation.RequestMapping;
16+
import org.springframework.web.bind.annotation.RestController;
17+
import reactor.core.publisher.Mono;
18+
19+
@RestController
20+
@RequestMapping("/api/v1/ai")
21+
@RequiredArgsConstructor
22+
@Slf4j
23+
@Tag(name = "AI Models", description = "AI model yönetimi API'leri")
24+
public class AIModelController {
25+
26+
private final AIModelService modelService;
27+
private final UserService userService;
28+
29+
@GetMapping("/models/available")
30+
@Operation(summary = "Kullanıcıya uygun AI modellerini getir", description = "Kullanıcının planına göre erişebileceği tüm AI modellerini getirir")
31+
public Mono<ResponseEntity<ModelResponse>> getAvailableModels() {
32+
return ReactiveSecurityContextHolder.getContext()
33+
.map(SecurityContext::getAuthentication)
34+
.map(Authentication::getName)
35+
.flatMap(userId -> {
36+
log.info("Kullanıcı için erişilebilir AI modelleri getiriliyor: userId={}", userId);
37+
return userService.getUserPlan(userId)
38+
.flatMap(userPlan ->
39+
userService.getUserPreferences(userId)
40+
.flatMap(preferences -> {
41+
// Son seçilen model yoksa varsayılan değer kullan
42+
final String lastSelectedModel = preferences.getLastSelectedModelId() != null ?
43+
preferences.getLastSelectedModelId() :
44+
modelService.getDefaultModelForPlan(userPlan);
45+
46+
return modelService.getAvailableModels(userPlan)
47+
.map(modelsData -> {
48+
ModelResponse response = ModelResponse.builder()
49+
.models(modelsData.getModels())
50+
.providers(modelsData.getProviders())
51+
.defaultModelId(modelService.getDefaultModelForPlan(userPlan))
52+
.userPlan(userPlan)
53+
.lastSelectedModelId(lastSelectedModel)
54+
.version(modelsData.getVersion())
55+
.build();
56+
return ResponseEntity.ok(response);
57+
});
58+
})
59+
)
60+
.doOnSuccess(response -> log.info("AI modelleri başarıyla getirildi: userId={}", userId))
61+
.doOnError(e -> log.error("AI modelleri getirilirken hata: userId={}, error={}", userId, e.getMessage()));
62+
});
63+
}
64+
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,5 @@ public class UserPreferenceRequest {
1919
private Map<String, Boolean> notifications;
2020
private Boolean pushEnabled;
2121
private List<String> aiModelFavorites;
22+
private String lastSelectedModelId;
2223
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ public class UserPreferenceResponse {
2020
private Map<String, Boolean> notifications;
2121
private Boolean pushEnabled;
2222
private List<String> aiModelFavorites;
23+
private String lastSelectedModelId;
2324
private Long createdAt;
2425
private Long updatedAt;
2526
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
package com.craftpilot.userservice.dto.ai;
2+
3+
import com.craftpilot.userservice.model.ai.AIModel;
4+
import com.craftpilot.userservice.model.ai.Provider;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
import java.util.List;
10+
11+
@Data
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class ModelResponse {
16+
private List<AIModel> models;
17+
private List<Provider> providers;
18+
private String defaultModelId;
19+
private String userPlan;
20+
private String lastSelectedModelId;
21+
private Integer version;
22+
}
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package com.craftpilot.userservice.dto.ai;
2+
3+
import com.craftpilot.userservice.model.ai.AIModel;
4+
import com.craftpilot.userservice.model.ai.Provider;
5+
import lombok.AllArgsConstructor;
6+
import lombok.Builder;
7+
import lombok.Data;
8+
import lombok.NoArgsConstructor;
9+
import java.util.List;
10+
11+
@Data
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
public class ModelsData {
16+
private List<AIModel> models;
17+
private List<Provider> providers;
18+
private Integer version;
19+
}

user-service/src/main/java/com/craftpilot/userservice/mapper/UserPreferenceMapper.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public UserPreference toEntity(UserPreferenceRequest dto) {
2424
.notifications(dto.getNotifications())
2525
.pushEnabled(dto.getPushEnabled())
2626
.aiModelFavorites(dto.getAiModelFavorites())
27+
.lastSelectedModelId(dto.getLastSelectedModelId())
2728
.build();
2829
}
2930

@@ -40,6 +41,7 @@ public UserPreferenceRequest toDto(UserPreference entity) {
4041
.notifications(entity.getNotifications())
4142
.pushEnabled(entity.getPushEnabled())
4243
.aiModelFavorites(entity.getAiModelFavorites())
44+
.lastSelectedModelId(entity.getLastSelectedModelId())
4345
.build();
4446
}
4547
}

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ public class UserPreference {
4949

5050
@Builder.Default
5151
private Boolean pushEnabled = false;
52+
53+
// Son seçilen AI modeli ID'si
54+
@Builder.Default
55+
private String lastSelectedModelId = "google/gemini-2.0-flash-lite-001";
5256

5357
// Zaman damgaları
5458
private Long createdAt;
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.craftpilot.userservice.model.ai;
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.annotation.TypeAlias;
9+
import com.google.cloud.firestore.annotation.DocumentId;
10+
11+
@Data
12+
@Builder
13+
@NoArgsConstructor
14+
@AllArgsConstructor
15+
@TypeAlias("aiModel")
16+
public class AIModel {
17+
@Id
18+
@DocumentId
19+
private String id;
20+
private String value;
21+
private String label;
22+
private String description;
23+
private String badge;
24+
private Boolean popular;
25+
private String provider;
26+
private String providerIcon;
27+
private Integer maxTokens;
28+
private Integer maxInputTokens;
29+
private String requiredPlan;
30+
}
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package com.craftpilot.userservice.model.ai;
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.annotation.TypeAlias;
9+
import com.google.cloud.firestore.annotation.DocumentId;
10+
import java.util.List;
11+
12+
@Data
13+
@Builder
14+
@NoArgsConstructor
15+
@AllArgsConstructor
16+
@TypeAlias("provider")
17+
public class Provider {
18+
@Id
19+
@DocumentId
20+
private String name;
21+
private String icon;
22+
private String description;
23+
private List<AIModel> models;
24+
}

0 commit comments

Comments
 (0)