destroy recordings when audio/video destroyed

This commit is contained in:
an-lee
2024-01-10 22:01:11 +08:00
parent c813a53a1e
commit f9b2ed849b
4 changed files with 32 additions and 7 deletions

View File

@@ -208,6 +208,12 @@ export class Audio extends Model<Audio> {
@AfterDestroy @AfterDestroy
static cleanupFile(audio: Audio) { static cleanupFile(audio: Audio) {
fs.remove(audio.filePath); fs.remove(audio.filePath);
Recording.destroy({
where: {
targetId: audio.id,
targetType: "Audio",
},
});
} }
static async buildFromLocalFile( static async buildFromLocalFile(

View File

@@ -1,4 +1,3 @@
import { app } from "electron";
import { import {
AfterCreate, AfterCreate,
AfterUpdate, AfterUpdate,
@@ -28,6 +27,8 @@ import webApi from "@main/web-api";
import { AzureSpeechSdk } from "@main/azure-speech-sdk"; import { AzureSpeechSdk } from "@main/azure-speech-sdk";
import camelcaseKeys from "camelcase-keys"; import camelcaseKeys from "camelcase-keys";
const logger = log.scope("db/models/recording");
@Table({ @Table({
modelName: "Recording", modelName: "Recording",
tableName: "recordings", tableName: "recordings",
@@ -119,7 +120,7 @@ export class Recording extends Model<Recording> {
return storage return storage
.put(this.md5, this.filePath) .put(this.md5, this.filePath)
.then((result) => { .then((result) => {
log.debug("[RECORDING]", "upload result:", result.data); logger.debug("upload result:", result.data);
if (result.data.success) { if (result.data.success) {
this.update({ uploadedAt: new Date() }); this.update({ uploadedAt: new Date() });
} else { } else {
@@ -127,7 +128,7 @@ export class Recording extends Model<Recording> {
} }
}) })
.catch((err) => { .catch((err) => {
log.error("[RECORDING]", "upload failed:", err.message); logger.error("upload failed:", err.message);
throw err; throw err;
}); });
} }
@@ -187,10 +188,10 @@ export class Recording extends Model<Recording> {
if (!Array.isArray(findResult)) findResult = [findResult]; if (!Array.isArray(findResult)) findResult = [findResult];
for (const instance of findResult) { for (const instance of findResult) {
if (instance.targetType === "Audio" && instance.audio !== undefined) { if (instance.targetType === "Audio" && instance.audio) {
instance.target = instance.audio.toJSON(); instance.target = instance.audio.toJSON();
} }
if (instance.targetType === "Video" && instance.video !== undefined) { if (instance.targetType === "Video" && instance.video) {
instance.target = instance.video.toJSON(); instance.target = instance.video.toJSON();
} }
// To prevent mistakes: // To prevent mistakes:
@@ -243,6 +244,13 @@ export class Recording extends Model<Recording> {
by: recording.duration, by: recording.duration,
}); });
}); });
} else if (recording.targetType === "Video") {
Video.findByPk(recording.targetId).then((video) => {
video.decrement("recordingsCount");
video.decrement("recordingsDuration", {
by: recording.duration,
});
});
} }
} }

View File

@@ -37,7 +37,7 @@ const logger = log.scope("db/models/video");
timestamps: true, timestamps: true,
}) })
export class Video extends Model<Video> { export class Video extends Model<Video> {
@IsUUID('all') @IsUUID("all")
@Default(DataType.UUIDV4) @Default(DataType.UUIDV4)
@Column({ primaryKey: true, type: DataType.UUID }) @Column({ primaryKey: true, type: DataType.UUID })
id: string; id: string;
@@ -230,6 +230,12 @@ export class Video extends Model<Video> {
@AfterDestroy @AfterDestroy
static cleanupFile(video: Video) { static cleanupFile(video: Video) {
fs.remove(video.filePath); fs.remove(video.filePath);
Recording.destroy({
where: {
targetId: video.id,
targetType: "Video",
},
});
} }
static async buildFromLocalFile( static async buildFromLocalFile(

View File

@@ -28,7 +28,7 @@ export const RecordingActivities = (props: { from: string; to: string }) => {
to, to,
}) })
.then((_activities) => { .then((_activities) => {
setActitivies(_activities); setActitivies(_activities || []);
}) })
.finally(() => { .finally(() => {
setLoading(false); setLoading(false);
@@ -88,6 +88,11 @@ const Activity = (props: {
}; };
}) => { }) => {
const { activity, displayDate } = props; const { activity, displayDate } = props;
if (!activity.target) {
return null;
}
return ( return (
<> <>
{displayDate && ( {displayDate && (