Lewati ke konten utama

Aset (Assets)

Pendahuluan

Modul Aset mengelola aset jaringan yang dimiliki oleh organisasi. Aset mewakili infrastruktur yang dilindungi (server, jaringan, layanan) yang dipantau oleh sensor. Setiap aset dapat dikaitkan dengan organisasi, sensor, dan pengguna penanggung jawab (Person-In-Charge/PIC). Logika bisnis dienkapsulasi dalam AssetService dengan akses data melalui AssetRepository.


Controller

File: API/Controllers/Assets/AssetsController.cs Rute: api/assets Mewarisi: ControllerBase Auth: [Authorize] (semua titik akhir memerlukan autentikasi) Delegasi ke: IAssetService

Titik Akhir (Endpoints)

Titik AkhirMetodeDeskripsi
api/assetsGETDaftar semua aset di organisasi saat ini
api/assets/{id}GETAmbil aset tunggal berdasarkan ID
api/assetsPOSTBuat aset baru
api/assets/{id}PUTPerbarui aset yang sudah ada
api/assets/{id}DELETEHapus aset

Pembatasan Organisasi

Titik akhir daftar mengambil ID organisasi dari klaim JWT:

var organizationId = UserHelper.GetOrganizationId(User);
if (!organizationId.HasValue)
{
return BadRequest(ApiEnvelope.Error("ID Organisasi tidak ditemukan dalam token", HttpContext.TraceIdentifier));
}
var assets = await _assetService.GetAssetsAsync(organizationId.Value);

Format Respons

Semua titik akhir menggunakan respons standar ApiEnvelope:

{
"success": true,
"data": {
"items": [...],
"count": 5
},
"errors": []
}

Entitas

File: Domain/Entities/Asset.cs Tabel: assets Namespace: Ravenxcope.Backend.Domain.Entities

KolomTipeBatasanDeskripsi
iduuidPKKunci utama (UUIDv7)
namevarchar(255)WajibNama tampilan aset
descriptiontextBisa nullDeskripsi aset
locationvarchar(255)Bisa nullLokasi fisik
as_numbervarchar(255)Bisa nullNomor Autonomous System
dnsvarchar(255)Bisa nullNama DNS atau IP
organization_iduuidFK (bisa null)Organisasi pemilik
sensor_iduuidFK (bisa null)Sensor terkait
pic_iduuidFK (bisa null)Penanggung jawab (User)
created_attimestampStempel waktu pembuatan
updated_attimestampStempel waktu pembaruan terakhir

Properti Navigasi

[ForeignKey("OrganizationId")]
public Organization? Organization { get; set; }

[ForeignKey("SensorId")]
public Sensor? Sensor { get; set; }

[ForeignKey("PicId")]
public User? Pic { get; set; }

Perilaku Kunci Asing (Foreign Key)

RelasiPerilaku
Organisasi → AsetSetNull
Sensor → AsetSetNull
Pengguna (PIC) → AsetSetNull

Semua FK menggunakan SetNull saat penghapusan — menghapus entitas induk akan mengatur FK menjadi null alih-alih menghapus aset secara cascade.


Layanan

File: Infrastructure/Services/AssetService.cs Antarmuka: IAssetService Masa Pakai (Lifetime): Scoped

Dependensi

DependensiTujuan
IAssetRepositoryOperasi CRUD Aset
IOrganizationRepositoryValidasi organisasi ada saat pembuatan
ISensorRepositoryValidasi sensor ada saat buat/update
IUserRepositoryValidasi user PIC ada saat buat/update

Metode Layanan

MetodeMengembalikanDeskripsi
GetAssetsAsync(Guid orgId)IReadOnlyList<AssetDto>Daftar aset berdasarkan organisasi
GetAssetAsync(Guid id)AssetDtoAmbil aset tunggal dengan relasinya
CreateAssetAsync(CreateAssetRequest)AssetDtoBuat aset dengan validasi FK
UpdateAssetAsync(Guid, UpdateAssetRequest)AssetDtoPerbarui field aset dengan validasi FK
DeleteAssetAsync(Guid id)voidHapus permanen aset

Validasi

Metode ValidateReferencesAsync memvalidasi referensi FK sebelum pembuatan/pembaruan:

  1. Jika organizationId disediakan → verifikasi organisasi ada
  2. Jika sensorId disediakan → verifikasi sensor ada
  3. Jika picId disediakan → verifikasi pengguna ada

Melempar ArgumentException dengan pesan deskriptif jika validasi gagal.


Repositori

File: Infrastructure/Repositories/AssetRepository.cs Antarmuka: IAssetRepository Basis: EfRepository<Asset> Masa Pakai (Lifetime): Scoped

Metode Kueri Khusus

MetodeMengembalikanDeskripsi
GetByOrganizationIdAsync(Guid)IReadOnlyList<Asset>Aset termasuk Organisasi, Sensor, dan PIC
GetByIdWithRelationsAsync(Guid)Asset?Aset tunggal dengan semua properti navigasi dimuat

DTO

DTO Permintaan

File: Application/DTOs/CreateAssetRequest.cs

PropertiTipeWajibDeskripsi
NamestringYaNama aset
Descriptionstring?TidakDeskripsi aset
Locationstring?TidakLokasi fisik
AsNumberstring?TidakNomor AS
Dnsstring?TidakNama DNS atau IP
OrganizationIdGuid?TidakOrganisasi pemilik
SensorIdGuid?TidakSensor terkait
PicIdGuid?TidakPenanggung jawab (User)

File: Application/DTOs/UpdateAssetRequest.cs

Field yang sama dengan CreateAssetRequest kecuali OrganizationId (hanya Name, Description, Location, AsNumber, Dns, SensorId, PicId). Semua field bisa null untuk pembaruan parsial.

DTO Respons

File: Application/DTOs/AssetDtos.cs

public sealed record AssetDto(
Guid Id,
string Name,
string? Description,
string? Location,
string? AsNumber,
string? Dns,
Guid? OrganizationId,
string? OrganizationName, // Diambil dari navigasi Organization
Guid? SensorId,
string? SensorName, // Diambil dari navigasi Sensor
Guid? PicId,
string? PicName, // Diambil dari navigasi User (PIC)
DateTime CreatedAt,
DateTime UpdatedAt);

Izin yang Ditanam (Seeded Permissions)

Izin CRUD Aset ditanamkan di ApplicationDbContext.OnModelCreating:

IzinSlug
Create Assetcreate-asset
Edit Assetedit-asset
Delete Assetdelete-asset
Read Assetread-asset

Registrasi DI

Dalam ServiceCollectionExtensions.AddBackendServicesAsync:

services.AddScoped<IAssetRepository, AssetRepository>();
services.AddScoped<IAssetService, AssetService>();

Perbaikan di Masa Depan

Selesai

  • Otorisasi berbasis izin pada titik akhir tulis (kebijakan manage-assets).

Terbuka

  • Menambahkan paginasi pada titik akhir daftar aset.
  • Menambahkan impor/ekspor massal untuk aset.
  • Menambahkan pelacakan status aset (aktif, dinonaktifkan, dll.).