Skip to content

Commit 86abcb5

Browse files
Merge branch 'main' of https://github.com/SECTL/SecScore
2 parents 50a66eb + 528d01d commit 86abcb5

7 files changed

Lines changed: 180 additions & 648 deletions

File tree

src/main/hosting/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,7 @@ export {
1616
ThemeServiceToken,
1717
WindowManagerToken,
1818
TrayServiceToken,
19-
AutoScoreServiceToken,
20-
FileSystemServiceToken
19+
AutoScoreServiceToken
2120
} from './tokens'
2221
export type {
2322
appRuntimeContext,

src/main/hosting/tokens.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,3 @@ export const ThemeServiceToken = Symbol.for('secscore.themeService')
1515
export const WindowManagerToken = Symbol.for('secscore.windowManager')
1616
export const TrayServiceToken = Symbol.for('secscore.trayService')
1717
export const AutoScoreServiceToken = Symbol.for('secscore.autoScoreService')
18-
export const FileSystemServiceToken = Symbol.for('secscore.fileSystemService')

src/main/index.ts

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import { ThemeService } from './services/ThemeService'
1616
import { WindowManager, type windowManagerOptions } from './services/WindowManager'
1717
import { TrayService } from './services/TrayService'
1818
import { AutoScoreService } from './services/AutoScoreService'
19-
import { FileSystemService } from './services/FileSystemService'
2019
import { DbConnectionService } from './services/DbConnectionService'
2120
import { StudentRepository } from './repos/StudentRepository'
2221
import { ReasonRepository } from './repos/ReasonRepository'
@@ -39,8 +38,7 @@ import {
3938
ThemeServiceToken,
4039
WindowManagerToken,
4140
TrayServiceToken,
42-
AutoScoreServiceToken,
43-
FileSystemServiceToken
41+
AutoScoreServiceToken
4442
} from './hosting'
4543

4644
type mainAppConfig = {
@@ -267,10 +265,6 @@ app.whenReady().then(async () => {
267265
TrayServiceToken,
268266
(p) => new TrayService(p.get(MainContext), config.window)
269267
)
270-
services.addSingleton(
271-
FileSystemServiceToken,
272-
(p) => new FileSystemService(p.get(MainContext), config.configDir)
273-
)
274268
services.addSingleton(AutoScoreServiceToken, (p) => new AutoScoreService(p.get(MainContext)))
275269
services.addSingleton(DbConnectionService, (p) => new DbConnectionService(p.get(MainContext)))
276270
})
@@ -320,7 +314,6 @@ app.whenReady().then(async () => {
320314
const tray = services.get(TrayServiceToken) as TrayService
321315
tray.initialize()
322316
}
323-
services.get(FileSystemServiceToken)
324317
const autoScore = services.get(AutoScoreServiceToken) as AutoScoreService
325318
await autoScore.initialize?.()
326319
services.get(DbConnectionService)

src/main/services/AutoScoreService.ts

Lines changed: 2 additions & 121 deletions
Original file line numberDiff line numberDiff line change
@@ -11,30 +11,12 @@ interface AutoScoreRule extends RuleConfig {
1111
lastExecuted?: Date
1212
}
1313

14-
interface AutoScoreRuleFileData {
15-
id: number
16-
enabled: boolean
17-
name: string
18-
studentNames: string[]
19-
lastExecuted?: string
20-
triggers?: Array<{ event: string; value?: string; relation?: 'AND' | 'OR' }>
21-
actions?: Array<{ event: string; value?: string; reason?: string }>
22-
}
23-
24-
interface AutoScoreRulesFile {
25-
version: number
26-
rules: AutoScoreRuleFileData[]
27-
updatedAt?: string
28-
}
29-
3014
declare module '../../shared/kernel' {
3115
interface Context {
3216
autoScore: AutoScoreService
3317
}
3418
}
3519

36-
const RULES_FILE_NAME = 'auto-score-rules.json'
37-
3820
export class AutoScoreService extends Service {
3921
private rules: AutoScoreRule[] = []
4022
private timers: Map<number, NodeJS.Timeout> = new Map()
@@ -130,83 +112,7 @@ export class AutoScoreService extends Service {
130112
}
131113

132114
private async loadRulesFromFile(): Promise<void> {
133-
try {
134-
const fs = this.mainCtx.fileSystem
135-
if (!fs) {
136-
this.logger.warn('FileSystemService not available, falling back to settings')
137-
await this.loadRulesFromSettings()
138-
return
139-
}
140-
141-
const data = await fs.readJsonFile<AutoScoreRulesFile>(RULES_FILE_NAME, 'automatic')
142-
if (data && data.rules) {
143-
this.rules = data.rules.map((rule: any) => {
144-
const migratedRule = this.migrateRule(rule)
145-
return {
146-
...migratedRule,
147-
lastExecuted: migratedRule.lastExecuted
148-
? new Date(migratedRule.lastExecuted)
149-
: undefined
150-
}
151-
})
152-
if (
153-
data.rules.some(
154-
(rule: any) => rule.intervalMinutes !== undefined || rule.scoreValue !== undefined
155-
)
156-
) {
157-
await this.saveRulesToFile()
158-
}
159-
} else {
160-
await this.loadRulesFromSettings()
161-
await this.saveRulesToFile()
162-
}
163-
} catch (error) {
164-
this.logger.warn('Failed to load auto score rules from file, falling back to settings', {
165-
error
166-
})
167-
await this.loadRulesFromSettings()
168-
}
169-
}
170-
171-
private migrateRule(rule: any): AutoScoreRule {
172-
if (!rule.intervalMinutes && !rule.scoreValue) {
173-
return rule
174-
}
175-
176-
const migratedRule: AutoScoreRule = {
177-
id: rule.id,
178-
enabled: rule.enabled,
179-
name: rule.name,
180-
studentNames: rule.studentNames || [],
181-
lastExecuted: rule.lastExecuted,
182-
triggers: rule.triggers || [],
183-
actions: rule.actions || []
184-
}
185-
186-
if (
187-
rule.intervalMinutes &&
188-
!migratedRule.triggers?.find((t) => t.event === 'interval_time_passed')
189-
) {
190-
migratedRule.triggers = migratedRule.triggers || []
191-
migratedRule.triggers.push({
192-
event: 'interval_time_passed',
193-
value: String(rule.intervalMinutes)
194-
})
195-
}
196-
197-
if (
198-
rule.scoreValue !== undefined &&
199-
!migratedRule.actions?.find((a) => a.event === 'add_score')
200-
) {
201-
migratedRule.actions = migratedRule.actions || []
202-
migratedRule.actions.push({
203-
event: 'add_score',
204-
value: String(rule.scoreValue),
205-
reason: rule.reason
206-
})
207-
}
208-
209-
return migratedRule
115+
await this.loadRulesFromSettings()
210116
}
211117

212118
private async loadRulesFromSettings() {
@@ -226,32 +132,7 @@ export class AutoScoreService extends Service {
226132
}
227133

228134
private async saveRulesToFile(): Promise<void> {
229-
try {
230-
const fs = this.mainCtx.fileSystem
231-
if (!fs) {
232-
this.logger.warn('FileSystemService not available, falling back to settings')
233-
await this.saveRulesToSettings()
234-
return
235-
}
236-
237-
const data: AutoScoreRulesFile = {
238-
version: 1,
239-
rules: this.rules.map(({ lastExecuted, ...rule }) => ({
240-
...rule,
241-
lastExecuted: lastExecuted?.toISOString()
242-
})),
243-
updatedAt: new Date().toISOString()
244-
}
245-
246-
const success = await fs.writeJsonFile(RULES_FILE_NAME, data, 'automatic')
247-
if (!success) {
248-
this.logger.warn('Failed to save rules to file, falling back to settings')
249-
await this.saveRulesToSettings()
250-
}
251-
} catch (error) {
252-
this.logger.error('Failed to save auto score rules to file:', { error })
253-
await this.saveRulesToSettings()
254-
}
135+
await this.saveRulesToSettings()
255136
}
256137

257138
private async saveRulesToSettings() {

0 commit comments

Comments
 (0)