Skip to content
This repository was archived by the owner on Apr 22, 2026. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
42 commits
Select commit Hold shift + click to select a range
80d92fe
correct the mapping
ssd2658 Mar 2, 2025
175ae68
Added app module for testing
ssd2658 Mar 2, 2025
b3892ba
comment config
ssd2658 Mar 2, 2025
ba15b29
undo change
ssd2658 Mar 2, 2025
a7fa323
updagrade pom and changed id long to UUID
ssd2658 Mar 2, 2025
0856827
resolved error
ssd2658 Mar 2, 2025
493e4ba
dummy commit
ssd2658 Mar 2, 2025
1f6ff1c
Added portfolio containerize test added
ssd2658 Mar 2, 2025
868b610
Added more validation for portfolio test
ssd2658 Mar 3, 2025
f71af97
Resolve error
ssd2658 Mar 3, 2025
99d7801
upgrade pom
ssd2658 Mar 3, 2025
c6b41c1
Added small change and upgrade pom -build failed
ssd2658 Mar 5, 2025
ed385b2
Add map struct
ssd2658 Mar 5, 2025
4f3e799
initail version commit
ssd2658 Mar 5, 2025
68fb067
Added service level change using entity data class
ssd2658 Mar 5, 2025
bfaae8d
dummy commit - build failed
ssd2658 Mar 7, 2025
c068376
added asset service
ssd2658 Mar 11, 2025
be88976
comment test
ssd2658 Mar 11, 2025
003ea99
Update pom.xml
ssd2658 Mar 11, 2025
f93fdc9
upgrade pom
ssd2658 Mar 11, 2025
b94197d
remove equity service
ssd2658 Mar 11, 2025
54953c4
pom upgraded
ssd2658 Mar 11, 2025
999e9e6
comment technical and upgrade pom
ssd2658 Mar 11, 2025
b59c114
REMOVE UNUSED FILE
ssd2658 Mar 11, 2025
8659fa5
clean up
ssd2658 Mar 11, 2025
d920262
Merge branch 'develop' into feature/clean-up
ssd2658 Mar 15, 2025
ecc51bb
Merge pull request #2 from AM-Portfolio/feature/clean-up
ssd2658 Mar 15, 2025
fe69da8
Added security mongo document
ssd2658 Mar 15, 2025
18f823b
Added security mongo module
ssd2658 Mar 15, 2025
cc71944
Updated market type
ssd2658 Mar 17, 2025
d002068
update repository
ssd2658 Mar 17, 2025
d531596
update pom and added security name
ssd2658 Mar 18, 2025
88b9b36
base verison upgrade
ssd2658 Mar 21, 2025
3dc0b33
feat: implement Redis caching service for portfolio and market data
ssd2658 Jul 27, 2025
9a33dc6
feat: initialize common data module with multi-module Maven structure
ssd2658 Jul 27, 2025
eceabf1
feat: implement security service with MongoDB persistence and auto-co…
ssd2658 Jul 31, 2025
eea07c7
feat: add SecurityService auto-configuration for dependency injection
ssd2658 Jul 31, 2025
cdb0b3b
feat: add security metadata models and container tests for MongoDB in…
ssd2658 Aug 16, 2025
16b55f3
test: add integration tests for SecurityService using MongoDB test co…
ssd2658 Aug 16, 2025
d9722c3
feat: migrate from PostgreSQL to MongoDB and implement portfolio service
ssd2658 Aug 23, 2025
f930e14
feat: add SecurityRepository and SecurityService with comprehensive s…
ssd2658 Aug 24, 2025
39cad2a
feat: initialize common data modules with MongoDB and Redis support
ssd2658 Aug 24, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ Add the following dependency to your `pom.xml`:
<dependency>
<groupId>com.yourcompany.library</groupId>
<artifactId>common-library</artifactId>
<version>1.0-SNAPSHOT</version>
<version>1.2.10-SNAPSHOT</version>
</dependency>
```

Expand Down
92 changes: 92 additions & 0 deletions am-common-cache-service/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
# Redis Service Module

This module provides Redis caching functionality for the Portfolio Management System. It handles caching of portfolio data, market indices, stock prices, and other related information.

## Features

- Caching for Portfolio Analysis and Summary
- Stock Price Caching (Real-time and Historical)
- Market Index Data Caching
- Portfolio Holdings Cache Management
- Redis Health Monitoring
- Redis Metrics Collection

## Configuration

The module uses Spring Boot's configuration properties. Key configurations can be set in `application.yml`:

```yaml
spring:
data:
redis:
redisendpoint: localhost:6379
portfolio-mover:
ttl: 300 # 5 minutes
key-prefix: "portfolio:mover:"
portfolio-summary:
ttl: 300 # 5 minutes
key-prefix: "portfolio:summary:"
# ... other configurations
```

## Services

- `StockPriceRedisService`: Manages stock price caching
- `MarketIndexIndicesRedisService`: Handles market index data caching
- `PortfolioAnalysisRedisService`: Caches portfolio analysis data
- `PortfolioHoldingsRedisService`: Manages portfolio holdings cache
- `PortfolioSummaryRedisService`: Handles portfolio summary caching

## Health Monitoring

The module includes a Redis health indicator that monitors:
- Redis connection status
- Redis version
- Redis mode
- Operation metrics

## Metrics

The following metrics are collected:
- Cache hits/misses
- Operation timing
- Redis connection status

## Usage

To use this module in your Spring Boot application:

1. Add the module dependency to your `pom.xml`:
```xml
<dependency>
<groupId>com.portfolio</groupId>
<artifactId>redis-service</artifactId>
<version>${project.version}</version>
</dependency>
```

2. The module will auto-configure itself through Spring Boot's auto-configuration mechanism.

3. Inject and use the required services:
```java
@Autowired
private StockPriceRedisService stockPriceRedisService;

@Autowired
private PortfolioSummaryRedisService portfolioSummaryRedisService;
```

## Error Handling

The module includes comprehensive error handling and logging:
- Redis operation exceptions are wrapped in `RedisOperationException`
- All operations are logged using SLF4J
- Failed operations are tracked in metrics

## Dependencies

- Spring Boot
- Spring Data Redis
- Lettuce Redis Client
- Lombok
- Spring Boot Actuator (for metrics and health monitoring)
84 changes: 84 additions & 0 deletions am-common-cache-service/pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<parent>
<groupId>com.portfolio</groupId>
<artifactId>am-portfolio</artifactId>
<version>1.2.10-SNAPSHOT</version>
</parent>

<artifactId>redis-service</artifactId>
<name>redis-service</name>
<description>Redis Service for Portfolio Management</description>

<dependencies>

<!-- Spring Boot Starters -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

<!-- Lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>

<!-- Test Dependencies -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>

<!-- Common Dependencies -->
<dependency>
<groupId>com.am.common</groupId>
<artifactId>am-common-investment-model</artifactId>
<version>${am.investment.version}</version>
</dependency>

<dependency>
<groupId>com.am.common</groupId>
<artifactId>am-common-data-model</artifactId>
<version>${am.common.version}</version>
</dependency>

<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
<skip>true</skip>
</configuration>
</plugin>
</plugins>
</build>
</project>
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.portfolio.redis;

import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.ComponentScan;

import com.portfolio.redis.config.RedisProperties;

@AutoConfiguration
@ComponentScan(basePackages = "com.portfolio.redis")
@EnableConfigurationProperties(RedisProperties.class)
public class RedisServiceAutoConfiguration {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.portfolio.redis.annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RedisCache {
String keyPrefix() default "";
long ttl() default 300; // Default TTL of 5 minutes
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package com.portfolio.redis.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.portfolio.redis.model.MarketIndexIndicesCache;
import com.portfolio.redis.model.PortfolioAnalysis;
import com.portfolio.redis.model.PortfolioHoldings;
import com.portfolio.redis.model.PortfolioSummaryV1;
import com.portfolio.redis.model.StockPriceCache;

@Configuration
public class RedisConfig {

@Bean
public RedisTemplate<String, PortfolioAnalysis> portfolioAnalysisRedisTemplate(RedisConnectionFactory connectionFactory) {
return createRedisTemplate(connectionFactory, PortfolioAnalysis.class);
}

@Bean
public RedisTemplate<String, PortfolioSummaryV1> portfolioSummaryRedisTemplate(RedisConnectionFactory connectionFactory) {
return createRedisTemplate(connectionFactory, PortfolioSummaryV1.class);
}

@Bean
public RedisTemplate<String, PortfolioHoldings> portfolioHoldingsRedisTemplate(RedisConnectionFactory connectionFactory) {
return createRedisTemplate(connectionFactory, PortfolioHoldings.class);
}

@Bean
public RedisTemplate<String, StockPriceCache> stockPriceRedisTemplate(RedisConnectionFactory connectionFactory) {
return createRedisTemplate(connectionFactory, StockPriceCache.class);
}

@Bean
public RedisTemplate<String, MarketIndexIndicesCache> marketIndexIndicesRedisTemplate(RedisConnectionFactory connectionFactory) {
return createRedisTemplate(connectionFactory, MarketIndexIndicesCache.class);
}

private <T> RedisTemplate<String, T> createRedisTemplate(RedisConnectionFactory connectionFactory, Class<T> clazz) {
RedisTemplate<String, T> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);

// Create ObjectMapper with proper configuration
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();

// Create serializer using the recommended approach (avoiding deprecated setObjectMapper)
Jackson2JsonRedisSerializer<T> serializer = new Jackson2JsonRedisSerializer<>(mapper, clazz);

template.setKeySerializer(new StringRedisSerializer());
template.setValueSerializer(serializer);
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(serializer);

return template;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
package com.portfolio.redis.config;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

import lombok.Data;

@Data
@Configuration
@ConfigurationProperties(prefix = "spring.data.redis")
public class RedisProperties {
private String redisendpoint;
private PortfolioMover portfolioMover = new PortfolioMover();
private PortfolioSummary portfolioSummary = new PortfolioSummary();
private PortfolioHoldings portfolioHoldings = new PortfolioHoldings();
private MarketIndices marketIndices = new MarketIndices();
private Stock stock = new Stock();

@Data
public static class PortfolioMover {
private Integer ttl;
private String keyPrefix;
}

@Data
public static class PortfolioSummary {
private Integer ttl;
private String keyPrefix;
}

@Data
public static class PortfolioHoldings {
private Integer ttl;
private String keyPrefix;
}

@Data
public static class MarketIndices {
private Integer ttl;
private String keyPrefix;
private Historical historical = new Historical();

@Data
public static class Historical {
private String keyPrefix;
private Integer ttl;
}
}

@Data
public static class Stock {
private Integer ttl;
private String keyPrefix;
private Historical historical = new Historical();

@Data
public static class Historical {
private String keyPrefix;
private Integer ttl;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package com.portfolio.redis.exception;

/**
* Custom exception for Redis operation failures
*/
public class RedisOperationException extends RuntimeException {

public RedisOperationException(String message) {
super(message);
}

public RedisOperationException(String message, Throwable cause) {
super(message, cause);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.portfolio.redis.model;

import java.time.LocalDateTime;

import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@JsonInclude(Include.NON_NULL)
public class BrokerPortfolioSummary {
private Double investmentValue;
private Double currentValue;
private Double totalGainLoss;
private Double totalGainLossPercentage;
private Integer totalAssets;
private LocalDateTime lastUpdated;
}
Loading