ce76046a29
- consolidate API ownership and remove dead vendor code - add Stripe billing, learning paths, and public CV hardening - add migration, recovery, security, audit, and browser gates
51 lines
2.3 KiB
C#
51 lines
2.3 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Text.Json.Serialization;
|
|
|
|
namespace JobTrackerApi.Models
|
|
{
|
|
public class Correspondence
|
|
{
|
|
public int Id { get; set; }
|
|
public int JobApplicationId { get; set; }
|
|
|
|
[JsonIgnore]
|
|
public JobApplication JobApplication { get; set; } = null!;
|
|
public string From { get; set; } = ""; // "Me" or "Company"
|
|
public string? Direction { get; set; } // inbound, outbound, internal, unknown
|
|
public string? Subject { get; set; }
|
|
public string? Channel { get; set; } // e.g. Email, Call, Note
|
|
public string? ExternalMessageId { get; set; }
|
|
public string? ExternalThreadId { get; set; }
|
|
public string? ExternalFrom { get; set; }
|
|
public string? ExternalTo { get; set; }
|
|
public string? ExternalLabelsJson { get; set; }
|
|
public string? AttachmentMetadataJson { get; set; }
|
|
// Provider discriminator: "gmail" | "microsoft" | "imap" | "manual". Set at the write
|
|
// site (import controller or the manual-entry endpoint), not inferred from other fields,
|
|
// so it stays correct even for hand-entered rows that happen to carry external-looking data.
|
|
public string? Provider { get; set; }
|
|
public string Content { get; set; } = "";
|
|
public DateTime Date { get; set; } = DateTime.Now;
|
|
|
|
[JsonIgnore]
|
|
public IReadOnlyList<string> ExternalLabels => string.IsNullOrWhiteSpace(ExternalLabelsJson)
|
|
? Array.Empty<string>()
|
|
: (System.Text.Json.JsonSerializer.Deserialize<List<string>>(ExternalLabelsJson) ?? new List<string>());
|
|
|
|
[JsonIgnore]
|
|
public IReadOnlyList<CorrespondenceAttachmentMetadata> AttachmentMetadata => string.IsNullOrWhiteSpace(AttachmentMetadataJson)
|
|
? Array.Empty<CorrespondenceAttachmentMetadata>()
|
|
: (System.Text.Json.JsonSerializer.Deserialize<List<CorrespondenceAttachmentMetadata>>(AttachmentMetadataJson) ?? new List<CorrespondenceAttachmentMetadata>());
|
|
}
|
|
|
|
public sealed class CorrespondenceAttachmentMetadata
|
|
{
|
|
public string? FileName { get; set; }
|
|
public string? MimeType { get; set; }
|
|
public long? SizeBytes { get; set; }
|
|
public string? GmailAttachmentId { get; set; }
|
|
public bool Inline { get; set; }
|
|
}
|
|
}
|