Add password reset functionality for admin users: implement ResetPassword endpoint, update AdminUserEndpoints to include password reset logic, and enhance user interface for password management. Update translations for new features and ensure proper error handling in the reset process.
This commit is contained in:
@@ -5,6 +5,7 @@ using TeleWave.Application.Admin.Users.CreateUser;
|
||||
using TeleWave.Application.Admin.Users.DeleteUser;
|
||||
using TeleWave.Application.Admin.Users.GetUser;
|
||||
using TeleWave.Application.Admin.Users.ListUsers;
|
||||
using TeleWave.Application.Admin.Users.ResetPassword;
|
||||
using TeleWave.Application.Admin.Users.UnblockUser;
|
||||
using TeleWave.Application.Common.Interfaces;
|
||||
using TeleWave.Application.Common.Models;
|
||||
@@ -29,6 +30,9 @@ public static class AdminUserEndpoints
|
||||
admin
|
||||
.MapPost("/{id:guid}/unblock", UnblockUser)
|
||||
.Produces(StatusCodes.Status204NoContent);
|
||||
admin
|
||||
.MapPost("/{id:guid}/password", ResetPassword)
|
||||
.Produces(StatusCodes.Status204NoContent);
|
||||
admin.MapDelete("/{id:guid}", DeleteUser).Produces(StatusCodes.Status204NoContent);
|
||||
|
||||
return app;
|
||||
@@ -96,6 +100,20 @@ public static class AdminUserEndpoints
|
||||
return result.ToHttpResult();
|
||||
}
|
||||
|
||||
private static async Task<IResult> ResetPassword(
|
||||
Guid id,
|
||||
ResetPasswordBody body,
|
||||
ISender sender,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
var result = await sender.Send(
|
||||
new ResetUserPasswordCommand(id, body.NewPassword),
|
||||
cancellationToken
|
||||
);
|
||||
return result.ToHttpResult();
|
||||
}
|
||||
|
||||
private static async Task<IResult> DeleteUser(
|
||||
Guid id,
|
||||
ISender sender,
|
||||
@@ -108,3 +126,5 @@ public static class AdminUserEndpoints
|
||||
}
|
||||
|
||||
public sealed record CreateUserBody(string UserName, string Password, Guid RoleId);
|
||||
|
||||
public sealed record ResetPasswordBody(string NewPassword);
|
||||
|
||||
@@ -538,8 +538,12 @@ public static class ChannelEndpoints
|
||||
new CreateProgrammingOverrideCommand(
|
||||
id,
|
||||
body.Mode,
|
||||
body.Recurrence,
|
||||
body.StartsAtUtc,
|
||||
body.EndsAtUtc,
|
||||
body.DayOfWeek,
|
||||
body.StartMinute,
|
||||
body.EndMinute,
|
||||
body.Shows
|
||||
),
|
||||
cancellationToken
|
||||
@@ -659,7 +663,11 @@ internal static class BumperFiles
|
||||
|
||||
public sealed record CreateOverrideBody(
|
||||
OverrideMode Mode,
|
||||
DateTimeOffset StartsAtUtc,
|
||||
DateTimeOffset EndsAtUtc,
|
||||
OverrideRecurrence Recurrence,
|
||||
DateTimeOffset? StartsAtUtc,
|
||||
DateTimeOffset? EndsAtUtc,
|
||||
int? DayOfWeek,
|
||||
int? StartMinute,
|
||||
int? EndMinute,
|
||||
IReadOnlyList<OverrideShowInput> Shows
|
||||
);
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
using LiteCqrs;
|
||||
using TeleWave.Application.Common.Models;
|
||||
|
||||
namespace TeleWave.Application.Admin.Users.ResetPassword;
|
||||
|
||||
/// <summary>Сброс пароля пользователя администратором (без текущего пароля).</summary>
|
||||
public sealed record ResetUserPasswordCommand(Guid UserId, string NewPassword) : ICommand<Result>;
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
using LiteCqrs;
|
||||
using TeleWave.Application.Common.Interfaces;
|
||||
using TeleWave.Application.Common.Models;
|
||||
|
||||
namespace TeleWave.Application.Admin.Users.ResetPassword;
|
||||
|
||||
public sealed class ResetUserPasswordCommandHandler(IIdentityService identityService)
|
||||
: ICommandHandler<ResetUserPasswordCommand, Result>
|
||||
{
|
||||
public Task<Result> Handle(
|
||||
ResetUserPasswordCommand command,
|
||||
CancellationToken cancellationToken
|
||||
) => identityService.ResetPasswordAsync(command.UserId, command.NewPassword, cancellationToken);
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
using FluentValidation;
|
||||
|
||||
namespace TeleWave.Application.Admin.Users.ResetPassword;
|
||||
|
||||
public sealed class ResetUserPasswordCommandValidator : AbstractValidator<ResetUserPasswordCommand>
|
||||
{
|
||||
public ResetUserPasswordCommandValidator()
|
||||
{
|
||||
// Длина — здесь; сложность (цифра/заглавная) проверяют валидаторы ASP.NET Identity при сбросе.
|
||||
RuleFor(x => x.UserId).NotEmpty();
|
||||
RuleFor(x => x.NewPassword).NotEmpty().MinimumLength(8);
|
||||
}
|
||||
}
|
||||
@@ -27,8 +27,12 @@ public sealed record OverrideShowDto(Guid ShowId, string ShowName, int Weight);
|
||||
public sealed record ProgrammingOverrideDto(
|
||||
Guid Id,
|
||||
OverrideMode Mode,
|
||||
DateTimeOffset StartsAtUtc,
|
||||
DateTimeOffset EndsAtUtc,
|
||||
OverrideRecurrence Recurrence,
|
||||
DateTimeOffset? StartsAtUtc,
|
||||
DateTimeOffset? EndsAtUtc,
|
||||
int? DayOfWeek,
|
||||
int? StartMinute,
|
||||
int? EndMinute,
|
||||
IReadOnlyList<OverrideShowDto> Shows
|
||||
);
|
||||
|
||||
|
||||
+6
-2
@@ -7,7 +7,11 @@ namespace TeleWave.Application.Broadcast.CreateOverride;
|
||||
public sealed record CreateProgrammingOverrideCommand(
|
||||
Guid ChannelId,
|
||||
OverrideMode Mode,
|
||||
DateTimeOffset StartsAtUtc,
|
||||
DateTimeOffset EndsAtUtc,
|
||||
OverrideRecurrence Recurrence,
|
||||
DateTimeOffset? StartsAtUtc,
|
||||
DateTimeOffset? EndsAtUtc,
|
||||
int? DayOfWeek,
|
||||
int? StartMinute,
|
||||
int? EndMinute,
|
||||
IReadOnlyList<OverrideShowInput> Shows
|
||||
) : ICommand<Result<Guid>>;
|
||||
|
||||
+26
-2
@@ -2,6 +2,7 @@ using LiteCqrs;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using TeleWave.Application.Common.Interfaces;
|
||||
using TeleWave.Application.Common.Models;
|
||||
using TeleWave.Domain.Broadcast;
|
||||
|
||||
namespace TeleWave.Application.Broadcast.CreateOverride;
|
||||
|
||||
@@ -13,8 +14,24 @@ public sealed class CreateProgrammingOverrideCommandHandler(IAppDbContext dbCont
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
if (command.EndsAtUtc <= command.StartsAtUtc)
|
||||
var weekly = command.Recurrence == OverrideRecurrence.Weekly;
|
||||
if (weekly)
|
||||
{
|
||||
if (
|
||||
command.DayOfWeek is not (>= 0 and <= 6)
|
||||
|| command.StartMinute is not { } sm
|
||||
|| command.EndMinute is not { } em
|
||||
|| em <= sm
|
||||
|| sm < 0
|
||||
|| em > 1440
|
||||
)
|
||||
return Result.Failure<Guid>(ChannelErrors.InvalidOverrideWindow);
|
||||
}
|
||||
else if (command.StartsAtUtc is not { } start || command.EndsAtUtc is not { } end || end <= start)
|
||||
{
|
||||
return Result.Failure<Guid>(ChannelErrors.InvalidOverrideWindow);
|
||||
}
|
||||
|
||||
if (command.Shows.Count == 0)
|
||||
return Result.Failure<Guid>(ChannelErrors.OverrideNeedsShow);
|
||||
|
||||
@@ -33,7 +50,14 @@ public sealed class CreateProgrammingOverrideCommandHandler(IAppDbContext dbCont
|
||||
if (existingCount != showIds.Count)
|
||||
return Result.Failure<Guid>(ChannelErrors.ShowNotFound);
|
||||
|
||||
var ovr = channel.AddOverride(command.Mode, command.StartsAtUtc, command.EndsAtUtc);
|
||||
var ovr = weekly
|
||||
? channel.AddWeeklyOverride(
|
||||
command.Mode,
|
||||
command.DayOfWeek!.Value,
|
||||
command.StartMinute!.Value,
|
||||
command.EndMinute!.Value
|
||||
)
|
||||
: channel.AddOverride(command.Mode, command.StartsAtUtc!.Value, command.EndsAtUtc!.Value);
|
||||
foreach (var show in command.Shows)
|
||||
ovr.AddShow(show.ShowId, show.Weight);
|
||||
|
||||
|
||||
@@ -104,12 +104,18 @@ public sealed class GetChannelQueryHandler(IAppDbContext dbContext)
|
||||
.ToList();
|
||||
|
||||
var overrides = channel.Overrides
|
||||
.OrderBy(o => o.StartsAtUtc)
|
||||
.OrderBy(o => o.Recurrence)
|
||||
.ThenBy(o => o.StartsAtUtc)
|
||||
.ThenBy(o => o.DayOfWeek)
|
||||
.Select(o => new ProgrammingOverrideDto(
|
||||
o.Id,
|
||||
o.Mode,
|
||||
o.Recurrence,
|
||||
o.StartsAtUtc,
|
||||
o.EndsAtUtc,
|
||||
o.DayOfWeek,
|
||||
o.StartMinute,
|
||||
o.EndMinute,
|
||||
o.Shows
|
||||
.Select(s => new OverrideShowDto(s.ShowId, ShowName(s.ShowId), s.Weight))
|
||||
.ToList()
|
||||
|
||||
@@ -562,10 +562,14 @@ public sealed class ScheduleGenerator(
|
||||
|
||||
var overrides = channel.Overrides
|
||||
.Select(o => new PlannerOverride(
|
||||
o.Mode,
|
||||
o.Shows.Select(s => new PlannerOverrideShow(s.ShowId, s.Weight)).ToList(),
|
||||
o.Recurrence,
|
||||
o.StartsAtUtc,
|
||||
o.EndsAtUtc,
|
||||
o.Mode,
|
||||
o.Shows.Select(s => new PlannerOverrideShow(s.ShowId, s.Weight)).ToList()
|
||||
o.DayOfWeek,
|
||||
o.StartMinute,
|
||||
o.EndMinute
|
||||
))
|
||||
.ToList();
|
||||
|
||||
|
||||
@@ -36,6 +36,13 @@ public interface IIdentityService
|
||||
CancellationToken cancellationToken
|
||||
);
|
||||
|
||||
/// <summary>Сброс пароля администратором — без текущего пароля (для чужого аккаунта).</summary>
|
||||
Task<Result> ResetPasswordAsync(
|
||||
Guid userId,
|
||||
string newPassword,
|
||||
CancellationToken cancellationToken
|
||||
);
|
||||
|
||||
Task<Result> ChangeUserNameAsync(
|
||||
Guid userId,
|
||||
string newUserName,
|
||||
|
||||
@@ -198,7 +198,20 @@ public class Channel
|
||||
DateTimeOffset endsAtUtc
|
||||
)
|
||||
{
|
||||
var ovr = ProgrammingOverride.Create(Id, mode, startsAtUtc, endsAtUtc);
|
||||
var ovr = ProgrammingOverride.CreateOneTime(Id, mode, startsAtUtc, endsAtUtc);
|
||||
_overrides.Add(ovr);
|
||||
return ovr;
|
||||
}
|
||||
|
||||
/// <summary>Еженедельный override: день недели (0=Вс..6=Сб) + окно минут суток (UTC).</summary>
|
||||
public ProgrammingOverride AddWeeklyOverride(
|
||||
OverrideMode mode,
|
||||
int dayOfWeek,
|
||||
int startMinute,
|
||||
int endMinute
|
||||
)
|
||||
{
|
||||
var ovr = ProgrammingOverride.CreateWeekly(Id, mode, dayOfWeek, startMinute, endMinute);
|
||||
_overrides.Add(ovr);
|
||||
return ovr;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
namespace TeleWave.Domain.Broadcast;
|
||||
|
||||
/// <summary>Как повторяется override программирования канала.</summary>
|
||||
public enum OverrideRecurrence
|
||||
{
|
||||
/// <summary>Разовое окно [StartsAtUtc, EndsAtUtc).</summary>
|
||||
OneTime,
|
||||
|
||||
/// <summary>Еженедельно в заданный день недели на окне часов суток (UTC).</summary>
|
||||
Weekly,
|
||||
}
|
||||
@@ -1,9 +1,12 @@
|
||||
namespace TeleWave.Domain.Broadcast;
|
||||
|
||||
/// <summary>
|
||||
/// Временный override программирования канала на окне [<see cref="StartsAtUtc"/>,
|
||||
/// <see cref="EndsAtUtc"/>). Марафон = <see cref="OverrideMode.Exclusive"/> с одним шоу и большим
|
||||
/// временным блоком. Пересекающийся с генерируемым временем override заменяет базовую ротацию.
|
||||
/// Временный override программирования канала. Разовый (<see cref="OverrideRecurrence.OneTime"/>) —
|
||||
/// на окне [<see cref="StartsAtUtc"/>, <see cref="EndsAtUtc"/>). Еженедельный
|
||||
/// (<see cref="OverrideRecurrence.Weekly"/>) — каждую неделю в <see cref="DayOfWeek"/> на окне минут
|
||||
/// суток [<see cref="StartMinute"/>, <see cref="EndMinute"/>) в UTC. Марафон = обычно
|
||||
/// <see cref="OverrideMode.Exclusive"/> с одним шоу; пересекающийся с генерируемым временем override
|
||||
/// заменяет базовую ротацию.
|
||||
/// </summary>
|
||||
public class ProgrammingOverride
|
||||
{
|
||||
@@ -12,14 +15,23 @@ public class ProgrammingOverride
|
||||
public Guid Id { get; private set; }
|
||||
public Guid ChannelId { get; private set; }
|
||||
public OverrideMode Mode { get; private set; }
|
||||
public DateTimeOffset StartsAtUtc { get; private set; }
|
||||
public DateTimeOffset EndsAtUtc { get; private set; }
|
||||
|
||||
public OverrideRecurrence Recurrence { get; private set; }
|
||||
|
||||
// ── OneTime ──
|
||||
public DateTimeOffset? StartsAtUtc { get; private set; }
|
||||
public DateTimeOffset? EndsAtUtc { get; private set; }
|
||||
|
||||
// ── Weekly ── (день недели 0=Вс..6=Сб как System.DayOfWeek/JS getDay; минуты суток 0..1440, UTC)
|
||||
public int? DayOfWeek { get; private set; }
|
||||
public int? StartMinute { get; private set; }
|
||||
public int? EndMinute { get; private set; }
|
||||
|
||||
public IReadOnlyList<OverrideShow> Shows => _shows;
|
||||
|
||||
private ProgrammingOverride() { }
|
||||
|
||||
internal static ProgrammingOverride Create(
|
||||
internal static ProgrammingOverride CreateOneTime(
|
||||
Guid channelId,
|
||||
OverrideMode mode,
|
||||
DateTimeOffset startsAtUtc,
|
||||
@@ -30,10 +42,29 @@ public class ProgrammingOverride
|
||||
Id = Guid.NewGuid(),
|
||||
ChannelId = channelId,
|
||||
Mode = mode,
|
||||
Recurrence = OverrideRecurrence.OneTime,
|
||||
StartsAtUtc = startsAtUtc,
|
||||
EndsAtUtc = endsAtUtc,
|
||||
};
|
||||
|
||||
internal static ProgrammingOverride CreateWeekly(
|
||||
Guid channelId,
|
||||
OverrideMode mode,
|
||||
int dayOfWeek,
|
||||
int startMinute,
|
||||
int endMinute
|
||||
) =>
|
||||
new()
|
||||
{
|
||||
Id = Guid.NewGuid(),
|
||||
ChannelId = channelId,
|
||||
Mode = mode,
|
||||
Recurrence = OverrideRecurrence.Weekly,
|
||||
DayOfWeek = dayOfWeek,
|
||||
StartMinute = startMinute,
|
||||
EndMinute = endMinute,
|
||||
};
|
||||
|
||||
public OverrideShow AddShow(Guid showId, int weight)
|
||||
{
|
||||
var entry = OverrideShow.Create(Id, showId, weight);
|
||||
@@ -41,5 +72,18 @@ public class ProgrammingOverride
|
||||
return entry;
|
||||
}
|
||||
|
||||
public bool Covers(DateTimeOffset moment) => moment >= StartsAtUtc && moment < EndsAtUtc;
|
||||
/// <summary>Действует ли override в этот момент (по типу повторения).</summary>
|
||||
public bool Covers(DateTimeOffset moment)
|
||||
{
|
||||
if (Recurrence == OverrideRecurrence.Weekly)
|
||||
{
|
||||
var utc = moment.UtcDateTime;
|
||||
var minuteOfDay = utc.Hour * 60 + utc.Minute;
|
||||
return (int)utc.DayOfWeek == DayOfWeek
|
||||
&& minuteOfDay >= StartMinute
|
||||
&& minuteOfDay < EndMinute;
|
||||
}
|
||||
|
||||
return moment >= StartsAtUtc && moment < EndsAtUtc;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -205,7 +205,7 @@ public static class SchedulePlanner
|
||||
IReadOnlyDictionary<Guid, PlannerShow> byShowId
|
||||
)
|
||||
{
|
||||
var ovr = input.Overrides.FirstOrDefault(o => moment >= o.StartsAtUtc && moment < o.EndsAtUtc);
|
||||
var ovr = input.Overrides.FirstOrDefault(o => o.Covers(moment));
|
||||
if (ovr is not null)
|
||||
{
|
||||
var overridden = new List<(PlannerShow, int)>();
|
||||
|
||||
@@ -19,13 +19,36 @@ public sealed record PlannerHourWindow(int StartHour, int EndHour)
|
||||
public bool Contains(int hour) => hour >= StartHour && hour < EndHour;
|
||||
}
|
||||
|
||||
/// <summary>Override в терминах планировщика: окно + режим + шоу с весами.</summary>
|
||||
/// <summary>
|
||||
/// Override в терминах планировщика: режим + шоу с весами + правило действия (разовое окно либо
|
||||
/// еженедельно по дню недели на окне минут суток UTC).
|
||||
/// </summary>
|
||||
public sealed record PlannerOverride(
|
||||
DateTimeOffset StartsAtUtc,
|
||||
DateTimeOffset EndsAtUtc,
|
||||
OverrideMode Mode,
|
||||
IReadOnlyList<PlannerOverrideShow> Shows
|
||||
);
|
||||
IReadOnlyList<PlannerOverrideShow> Shows,
|
||||
OverrideRecurrence Recurrence = OverrideRecurrence.OneTime,
|
||||
DateTimeOffset? StartsAtUtc = null,
|
||||
DateTimeOffset? EndsAtUtc = null,
|
||||
int? DayOfWeek = null,
|
||||
int? StartMinute = null,
|
||||
int? EndMinute = null
|
||||
)
|
||||
{
|
||||
/// <summary>Действует ли override в этот момент.</summary>
|
||||
public bool Covers(DateTimeOffset moment)
|
||||
{
|
||||
if (Recurrence == OverrideRecurrence.Weekly)
|
||||
{
|
||||
var utc = moment.UtcDateTime;
|
||||
var minuteOfDay = utc.Hour * 60 + utc.Minute;
|
||||
return (int)utc.DayOfWeek == DayOfWeek
|
||||
&& minuteOfDay >= StartMinute
|
||||
&& minuteOfDay < EndMinute;
|
||||
}
|
||||
|
||||
return moment >= StartsAtUtc && moment < EndsAtUtc;
|
||||
}
|
||||
}
|
||||
|
||||
public sealed record PlannerOverrideShow(Guid ShowId, int Weight);
|
||||
|
||||
|
||||
@@ -99,6 +99,29 @@ internal sealed class IdentityService(
|
||||
);
|
||||
}
|
||||
|
||||
public async Task<Result> ResetPasswordAsync(
|
||||
Guid userId,
|
||||
string newPassword,
|
||||
CancellationToken cancellationToken
|
||||
)
|
||||
{
|
||||
var user = await userManager.FindByIdAsync(userId.ToString());
|
||||
if (user is null)
|
||||
return Result.Failure(UserErrors.NotFound);
|
||||
|
||||
// Админ меняет чужой пароль — без текущего: сбрасываем через одноразовый токен сброса.
|
||||
var token = await userManager.GeneratePasswordResetTokenAsync(user);
|
||||
var result = await userManager.ResetPasswordAsync(user, token, newPassword);
|
||||
return result.Succeeded
|
||||
? Result.Success()
|
||||
: Result.Failure(
|
||||
Error.Validation(
|
||||
"Auth.ResetPasswordFailed",
|
||||
string.Join("; ", result.Errors.Select(e => e.Description))
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
public async Task<Result> ChangeUserNameAsync(
|
||||
Guid userId,
|
||||
string newUserName,
|
||||
|
||||
backend/src/TeleWave.Infrastructure/Migrations/20260725164501_WeeklyProgrammingOverrides.Designer.cs
Generated
+1008
File diff suppressed because it is too large
Load Diff
+96
@@ -0,0 +1,96 @@
|
||||
using System;
|
||||
using Microsoft.EntityFrameworkCore.Migrations;
|
||||
|
||||
#nullable disable
|
||||
|
||||
namespace TeleWave.Infrastructure.Migrations
|
||||
{
|
||||
/// <inheritdoc />
|
||||
public partial class WeeklyProgrammingOverrides : Migration
|
||||
{
|
||||
/// <inheritdoc />
|
||||
protected override void Up(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.AlterColumn<DateTimeOffset>(
|
||||
name: "StartsAtUtc",
|
||||
table: "ProgrammingOverride",
|
||||
type: "timestamp with time zone",
|
||||
nullable: true,
|
||||
oldClrType: typeof(DateTimeOffset),
|
||||
oldType: "timestamp with time zone");
|
||||
|
||||
migrationBuilder.AlterColumn<DateTimeOffset>(
|
||||
name: "EndsAtUtc",
|
||||
table: "ProgrammingOverride",
|
||||
type: "timestamp with time zone",
|
||||
nullable: true,
|
||||
oldClrType: typeof(DateTimeOffset),
|
||||
oldType: "timestamp with time zone");
|
||||
|
||||
migrationBuilder.AddColumn<int>(
|
||||
name: "DayOfWeek",
|
||||
table: "ProgrammingOverride",
|
||||
type: "integer",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<int>(
|
||||
name: "EndMinute",
|
||||
table: "ProgrammingOverride",
|
||||
type: "integer",
|
||||
nullable: true);
|
||||
|
||||
migrationBuilder.AddColumn<int>(
|
||||
name: "Recurrence",
|
||||
table: "ProgrammingOverride",
|
||||
type: "integer",
|
||||
nullable: false,
|
||||
defaultValue: 0);
|
||||
|
||||
migrationBuilder.AddColumn<int>(
|
||||
name: "StartMinute",
|
||||
table: "ProgrammingOverride",
|
||||
type: "integer",
|
||||
nullable: true);
|
||||
}
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void Down(MigrationBuilder migrationBuilder)
|
||||
{
|
||||
migrationBuilder.DropColumn(
|
||||
name: "DayOfWeek",
|
||||
table: "ProgrammingOverride");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "EndMinute",
|
||||
table: "ProgrammingOverride");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "Recurrence",
|
||||
table: "ProgrammingOverride");
|
||||
|
||||
migrationBuilder.DropColumn(
|
||||
name: "StartMinute",
|
||||
table: "ProgrammingOverride");
|
||||
|
||||
migrationBuilder.AlterColumn<DateTimeOffset>(
|
||||
name: "StartsAtUtc",
|
||||
table: "ProgrammingOverride",
|
||||
type: "timestamp with time zone",
|
||||
nullable: false,
|
||||
defaultValue: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
|
||||
oldClrType: typeof(DateTimeOffset),
|
||||
oldType: "timestamp with time zone",
|
||||
oldNullable: true);
|
||||
|
||||
migrationBuilder.AlterColumn<DateTimeOffset>(
|
||||
name: "EndsAtUtc",
|
||||
table: "ProgrammingOverride",
|
||||
type: "timestamp with time zone",
|
||||
nullable: false,
|
||||
defaultValue: new DateTimeOffset(new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified), new TimeSpan(0, 0, 0, 0, 0)),
|
||||
oldClrType: typeof(DateTimeOffset),
|
||||
oldType: "timestamp with time zone",
|
||||
oldNullable: true);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -478,13 +478,25 @@ namespace TeleWave.Infrastructure.Migrations
|
||||
b.Property<Guid>("ChannelId")
|
||||
.HasColumnType("uuid");
|
||||
|
||||
b.Property<DateTimeOffset>("EndsAtUtc")
|
||||
b.Property<int?>("DayOfWeek")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int?>("EndMinute")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTimeOffset?>("EndsAtUtc")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.Property<int>("Mode")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTimeOffset>("StartsAtUtc")
|
||||
b.Property<int>("Recurrence")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<int?>("StartMinute")
|
||||
.HasColumnType("integer");
|
||||
|
||||
b.Property<DateTimeOffset?>("StartsAtUtc")
|
||||
.HasColumnType("timestamp with time zone");
|
||||
|
||||
b.HasKey("Id");
|
||||
|
||||
Reference in New Issue
Block a user