1+ using Microsoft . EntityFrameworkCore ;
2+ using SorobanSecurityPortalApi . Common . Data ;
3+ using SorobanSecurityPortalApi . Models . DbModels ;
4+ using SorobanSecurityPortalApi . Models . ViewModels ;
5+
6+ namespace SorobanSecurityPortalApi . Data . Processors
7+ {
8+ public class BookmarkProcessor : IBookmarkProcessor
9+ {
10+ private readonly IDbContextFactory < Db > _dbFactory ;
11+
12+ public BookmarkProcessor ( IDbContextFactory < Db > dbFactory )
13+ {
14+ _dbFactory = dbFactory ;
15+ }
16+
17+ public async Task < BookmarkModel > Get ( int bookmarkModelId )
18+ {
19+ await using var db = await _dbFactory . CreateDbContextAsync ( ) ;
20+ var bookmark = await db . Bookmark . FindAsync ( bookmarkModelId ) ;
21+ if ( bookmark == null )
22+ {
23+ throw new KeyNotFoundException ( $ "Bookmark with ID { bookmarkModelId } not found") ;
24+ }
25+ return bookmark ;
26+ }
27+
28+ public async Task < BookmarkViewModel > Add ( BookmarkModel bookmarkModel )
29+ {
30+ await using var db = await _dbFactory . CreateDbContextAsync ( ) ;
31+ if ( bookmarkModel == null )
32+ {
33+ throw new ArgumentNullException ( nameof ( bookmarkModel ) , "Bookmark model cannot be null" ) ;
34+ }
35+ var title = "" ;
36+ var description = "" ;
37+ if ( bookmarkModel . BookmarkType == BookmarkTypeEnum . Report )
38+ {
39+ var report = await db . Report . FindAsync ( bookmarkModel . ItemId ) ;
40+ if ( report == null )
41+ {
42+ throw new KeyNotFoundException ( $ "Report with ID { bookmarkModel . ItemId } not found") ;
43+ }
44+ title = report . Name ;
45+ }
46+ else if ( bookmarkModel . BookmarkType == BookmarkTypeEnum . Vulnerability )
47+ {
48+ var vulnerability = await db . Vulnerability . FindAsync ( bookmarkModel . ItemId ) ;
49+ if ( vulnerability == null )
50+ {
51+ throw new KeyNotFoundException ( $ "Vulnerability with ID { bookmarkModel . ItemId } not found") ;
52+ }
53+ title = vulnerability . Title ;
54+ description = vulnerability . Description ;
55+ }
56+ else
57+ {
58+ throw new ArgumentException ( $ "Invalid BookmarkType: { bookmarkModel . BookmarkType } ") ;
59+ }
60+ db . Bookmark . Add ( bookmarkModel ) ;
61+ await db . SaveChangesAsync ( ) ;
62+ return new BookmarkViewModel
63+ {
64+ Id = bookmarkModel . Id ,
65+ ItemId = bookmarkModel . ItemId ,
66+ BookmarkType = bookmarkModel . BookmarkType ,
67+ Title = title ,
68+ Description = description
69+ } ;
70+ }
71+
72+ public async Task Delete ( int bookmarkModelId )
73+ {
74+ await using var db = await _dbFactory . CreateDbContextAsync ( ) ;
75+ var bookmark = await db . Bookmark . FindAsync ( bookmarkModelId ) ;
76+ if ( bookmark == null )
77+ {
78+ throw new KeyNotFoundException ( $ "Bookmark with ID { bookmarkModelId } not found") ;
79+ }
80+ db . Bookmark . Remove ( bookmark ) ;
81+ await db . SaveChangesAsync ( ) ;
82+ }
83+
84+ public async Task < List < BookmarkViewModel > > List ( )
85+ {
86+ await using var db = await _dbFactory . CreateDbContextAsync ( ) ;
87+ var bookmarks = await db . Bookmark . OrderByDescending ( x => x . Id ) . ToListAsync ( ) ;
88+ var res = new List < BookmarkViewModel > ( ) ;
89+ foreach ( var bookmark in bookmarks )
90+ {
91+ if ( bookmark . BookmarkType == BookmarkTypeEnum . Report )
92+ {
93+ var report = await db . Report . FindAsync ( bookmark . ItemId ) ;
94+ if ( report == null )
95+ {
96+ throw new Exception ( $ "Report with ID { bookmark . ItemId } not found for bookmark ID { bookmark . Id } ") ;
97+ }
98+ res . Add ( new BookmarkViewModel
99+ {
100+ Id = bookmark . Id ,
101+ ItemId = report . Id ,
102+ BookmarkType = bookmark . BookmarkType ,
103+ Title = report . Name ,
104+ Description = ""
105+ } ) ;
106+ } else
107+ {
108+ var vulnerability = await db . Vulnerability . FindAsync ( bookmark . ItemId ) ;
109+ if ( vulnerability == null )
110+ {
111+ throw new Exception ( $ "Vulnerability with ID { bookmark . ItemId } not found for bookmark ID { bookmark . Id } ") ;
112+ }
113+ res . Add ( new BookmarkViewModel
114+ {
115+ Id = bookmark . Id ,
116+ ItemId = vulnerability . Id ,
117+ BookmarkType = bookmark . BookmarkType ,
118+ Title = vulnerability . Title ,
119+ Description = vulnerability . Description
120+ } ) ;
121+ }
122+ }
123+ return res ;
124+ }
125+
126+ }
127+
128+ public interface IBookmarkProcessor
129+ {
130+ Task < BookmarkModel > Get ( int bookmarkModelId ) ;
131+ Task < BookmarkViewModel > Add ( BookmarkModel bookmarkModel ) ;
132+ Task Delete ( int bookmarkModelId ) ;
133+ Task < List < BookmarkViewModel > > List ( ) ;
134+ }
135+ }
0 commit comments