Files
fixed-smile-api/src/safe-zones/safe-zones.service.ts
T
2026-07-20 18:21:31 +02:00

105 lines
3.1 KiB
TypeScript

import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import { SafeZone } from './entities/safe-zone.entity';
import { SafeZoneDto, SafeZoneSettingsDto } from './dto/safe-zone.dto';
import { User } from '../users/entities/user.entity';
@Injectable()
export class SafeZonesService {
constructor(
@InjectRepository(SafeZone)
private zoneRepo: Repository<SafeZone>,
@InjectRepository(User)
private userRepo: Repository<User>,
) {}
async findAll(userId: number) {
const zones = await this.zoneRepo.find({
where: { userId },
order: { Created: 'DESC' },
});
return zones.map((z) => ({
Id: z.Id,
Name: z.Name,
Location: { Lat: z.Lat, Lng: z.Lng },
Radius: z.Radius,
WifiName: z.WifiName,
Created: z.Created,
}));
}
async create(userId: number, dto: SafeZoneDto) {
const zone = this.zoneRepo.create({
Name: dto.Name || '',
Lat: dto.Location?.Lat || 0,
Lng: dto.Location?.Lng || 0,
Radius: dto.Radius || 100,
WifiName: dto.WifiName,
userId,
});
const saved = await this.zoneRepo.save(zone);
return {
Id: saved.Id,
Name: saved.Name,
Location: { Lat: saved.Lat, Lng: saved.Lng },
Radius: saved.Radius,
WifiName: saved.WifiName,
Created: saved.Created,
};
}
async update(userId: number, id: number, dto: SafeZoneDto) {
const zone = await this.zoneRepo.findOne({ where: { Id: id, userId } });
if (!zone) throw new NotFoundException('Safe zone not found');
if (dto.Name !== undefined) zone.Name = dto.Name;
if (dto.Location) {
if (dto.Location.Lat !== undefined) zone.Lat = dto.Location.Lat;
if (dto.Location.Lng !== undefined) zone.Lng = dto.Location.Lng;
}
if (dto.Radius !== undefined) zone.Radius = dto.Radius;
if (dto.WifiName !== undefined) zone.WifiName = dto.WifiName;
await this.zoneRepo.save(zone);
return {
Id: zone.Id,
Name: zone.Name,
Location: { Lat: zone.Lat, Lng: zone.Lng },
Radius: zone.Radius,
WifiName: zone.WifiName,
Created: zone.Created,
};
}
async delete(userId: number, id: number): Promise<void> {
const result = await this.zoneRepo.delete({ Id: id, userId });
if (result.affected === 0)
throw new NotFoundException('Safe zone not found');
}
async getSettings(userId: number) {
const user = await this.userRepo.findOne({ where: { id: userId } });
if (!user) throw new NotFoundException('User not found');
return {
Enabled: user.SafeZoneEnabled,
LastUpdate: new Date(user.Created as any).toISOString(),
};
}
async updateSettings(userId: number, dto: SafeZoneSettingsDto) {
const user = await this.userRepo.findOne({ where: { id: userId } });
if (!user) throw new NotFoundException('User not found');
user.SafeZoneEnabled = dto.Enabled;
await this.userRepo.save(user);
return {
Enabled: user.SafeZoneEnabled,
LastUpdate: new Date().toISOString(),
};
}
async getDefaultRadius() {
return { Radius: 100 };
}
}