use crate::domain::{DependencyType, Issue, IssueId, NewIssue};
use crate::error::{Error, Result};
use crate::id_generation::{IdGenerator, IdGeneratorConfig};
use petgraph::graph::{DiGraph, NodeIndex};
use std::collections::HashMap;
pub(crate) struct InMemoryStorageInner {
pub(super) issues: HashMap<IssueId, Issue>,
pub(super) graph: DiGraph<IssueId, DependencyType>,
pub(super) node_map: HashMap<IssueId, NodeIndex>,
pub(super) id_generator: IdGenerator,
prefix: String,
}
impl InMemoryStorageInner {
pub(crate) fn new(prefix: String) -> Self {
let config = IdGeneratorConfig {
prefix: prefix.clone(),
database_size: 0,
};
Self {
issues: HashMap::new(),
graph: DiGraph::new(),
node_map: HashMap::new(),
id_generator: IdGenerator::new(config),
prefix,
}
}
pub(super) fn update_id_generator_if_needed(&mut self) {
let current_size = self.issues.len();
let old_size = self.id_generator.database_size();
let needs_update = match (old_size, current_size) {
(0..=500, 501..) => true,
(0..=1500, 1501..) => true,
(501.., 0..=500) => true,
(1501.., 0..=1500) => true,
_ => false,
};
if needs_update {
self.id_generator = IdGenerator::new(IdGeneratorConfig {
prefix: self.prefix.clone(),
database_size: current_size,
});
for id in self.issues.keys() {
self.id_generator.register_id(id.as_str().to_string());
}
}
}
pub(super) fn generate_id(&mut self, new_issue: &NewIssue) -> Result<IssueId> {
self.update_id_generator_if_needed();
let id_str = self
.id_generator
.generate(
&new_issue.title,
&new_issue.description,
new_issue.assignee.as_deref(),
None, )
.map_err(|e| Error::Storage(format!("ID generation failed: {}", e)))?;
Ok(IssueId::new(id_str))
}
}