Skip to content
Merged

Dev #62

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
159c02f
время жизни 20 минут
Kitiketov Dec 13, 2025
7725cb1
Merge remote-tracking branch 'origin/dev' into dev
Kitiketov Dec 13, 2025
dc17432
обработка ошибок стороннего Api через Result
Jlychee Dec 14, 2025
aa9021d
обработка ошибок стороннего Api через Result
Jlychee Dec 14, 2025
e6e319d
Merge remote-tracking branch 'origin/dev' into dev
Jlychee Dec 14, 2025
ea937e6
фывапп
fan4cz Dec 14, 2025
6a0b216
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
4866260
dsa
fan4cz Dec 15, 2025
0184e6f
dasfdf
fan4cz Dec 15, 2025
66ccaea
Merge pull request #41 from fan4cz/dev
fan4cz Dec 15, 2025
07fa94c
qwerewtre
fan4cz Dec 15, 2025
560c297
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
70f76df
Merge pull request #42 from fan4cz/dev
fan4cz Dec 15, 2025
5cd6eb8
fix
fan4cz Dec 15, 2025
2e0b3c0
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
15bc534
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
e2eafc9
Merge pull request #43 from fan4cz/dev
fan4cz Dec 15, 2025
bd9b312
пробуем сжимать
Jlychee Dec 15, 2025
a513143
ыовлаоывлафоывджлафы
Jlychee Dec 15, 2025
7aa709a
asgdg
fan4cz Dec 15, 2025
b42b706
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
0170cd7
Merge pull request #44 from fan4cz/dev
fan4cz Dec 15, 2025
f128e24
это на фронте будет, пофиг
Jlychee Dec 15, 2025
2265ed1
Merge remote-tracking branch 'origin/dev' into dev
Jlychee Dec 15, 2025
2b5468f
fsdgsdh
fan4cz Dec 15, 2025
20b9331
Merge pull request #45 from fan4cz/dev
fan4cz Dec 15, 2025
69db6e1
dfghj
fan4cz Dec 15, 2025
feaa149
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
5afdc0c
Merge pull request #46 from fan4cz/dev
fan4cz Dec 15, 2025
0d55d9a
fgdhfjgh
fan4cz Dec 15, 2025
b0c9ed2
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
f3d4966
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
6cfa5d6
Merge pull request #47 from fan4cz/dev
fan4cz Dec 15, 2025
8e1b397
sfdftg
fan4cz Dec 15, 2025
f7f9419
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
6ea0474
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
660859f
Merge pull request #48 from fan4cz/dev
fan4cz Dec 15, 2025
3a00c25
gdfzhd
fan4cz Dec 15, 2025
1886fee
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
8cb3cb4
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
cfaf0c1
Merge pull request #49 from fan4cz/dev
fan4cz Dec 15, 2025
d465e0e
erwdfh
fan4cz Dec 15, 2025
602907f
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
5c1ffa0
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
e8426ba
Merge pull request #50 from fan4cz/dev
fan4cz Dec 15, 2025
c40994c
qewretrtyu
fan4cz Dec 15, 2025
5c899af
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
50d6ddf
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
6103873
Merge pull request #51 from fan4cz/dev
fan4cz Dec 15, 2025
3a94131
erjnefdfbnsnhbsljkdbjlfdk.nvbk jkrtblgnbjsdlhkbnlajtiudhgfnarjeiudfhg…
fan4cz Dec 15, 2025
ecac326
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
e42bbd9
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
a1d4252
Merge pull request #52 from fan4cz/dev
fan4cz Dec 15, 2025
36cb94a
hxjfhkfujtysrthgfhgmdktsrutjsgfdhj6srtygfxdysyrjfg
fan4cz Dec 15, 2025
9496b23
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
db57e02
забираю монетки
Jlychee Dec 15, 2025
91112fb
add lvl
Jlychee Dec 15, 2025
c803840
не, ну наверное вот так все-таки
Jlychee Dec 15, 2025
461ba22
fgrthghfdf
fan4cz Dec 15, 2025
6db9ee7
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
cdd638d
dfgdfbgn
fan4cz Dec 15, 2025
a2054a2
Merge pull request #53 from fan4cz/dev
fan4cz Dec 15, 2025
16c39d0
eqgdfhgdhgd
fan4cz Dec 15, 2025
da93584
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
350ab1f
Merge pull request #54 from fan4cz/dev
fan4cz Dec 15, 2025
c360e78
rthyjukfjgfhtrgdhgfn
fan4cz Dec 15, 2025
845b005
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 15, 2025
547efd0
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 15, 2025
4560a2b
Merge pull request #55 from fan4cz/dev
fan4cz Dec 15, 2025
624cf45
reghgfnhmuktyr
fan4cz Dec 16, 2025
e9da90f
Merge pull request #56 from fan4cz/dev
fan4cz Dec 16, 2025
e4908e2
efgdds
fan4cz Dec 16, 2025
bbe9123
Merge pull request #57 from fan4cz/dev
fan4cz Dec 16, 2025
afb8fce
первый тест
fan4cz Dec 16, 2025
7af8803
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 16, 2025
e80b891
Merge pull request #58 from fan4cz/dev
fan4cz Dec 16, 2025
243e774
fix
fan4cz Dec 16, 2025
401ee40
Merge branch 'dev' of https://github.com/fan4cz/Vibik.Server into dev
fan4cz Dec 16, 2025
38fb5aa
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 16, 2025
fb5f9ad
Merge pull request #59 from fan4cz/dev
fan4cz Dec 16, 2025
582b4e9
TEST
Jlychee Dec 16, 2025
1d3fa50
TEST (я абоба)
Jlychee Dec 16, 2025
9863c98
Merge remote-tracking branch 'origin/dev' into dev
Jlychee Dec 16, 2025
d599f84
UserTableTest
fan4cz Dec 16, 2025
4c1904c
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 16, 2025
703b0e8
Merge pull request #60 from fan4cz/dev
fan4cz Dec 16, 2025
fd0bd8f
йкцупкрвпьаобл
fan4cz Dec 16, 2025
217f49e
Merge branch 'Jlychee:dev' into dev
fan4cz Dec 16, 2025
95b1cd7
Merge pull request #61 from fan4cz/dev
fan4cz Dec 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions .github/workflows/test_and_deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,21 @@ jobs:
tests-and-format:
runs-on: ubuntu-latest

services:
postgres:
image: postgres:16
env:
POSTGRES_DB: vibik_test
POSTGRES_USER: vibik_user
POSTGRES_PASSWORD: vibik_pass
ports:
- 5432:5432
options: >-
--health-cmd="pg_isready -U vibik_user"
--health-interval=10s
--health-timeout=5s
--health-retries=5

steps:
- name: Checkout repository
uses: actions/checkout@v5
Expand All @@ -26,7 +41,13 @@ jobs:
run: dotnet build --no-restore -c Release

- name: Run tests
run: dotnet test --no-build --verbosity normal
env:
POSTGRES_DB: vibik_test
POSTGRES_USER: vibik_user
POSTGRES_PASSWORD: vibik_pass
POSTGRES_SERVER: localhost
POSTGRES_PORT: 5432
run: dotnet test --configuration Release --no-build --verbosity normal

- name: Dotnet format whitespace (fix)
run: dotnet format whitespace
Expand Down Expand Up @@ -91,4 +112,4 @@ jobs:
cd vibik
sudo docker compose pull
sudo docker compose down
sudo docker compose up -d
sudo docker compose up -d
1 change: 1 addition & 0 deletions Api/Api.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@
<ItemGroup>
<PackageReference Include="AWSSDK.S3" Version="4.0.11.3"/>
<PackageReference Include="DotNetEnv" Version="3.1.1"/>
<PackageReference Include="Magick.NET-Q8-AnyCPU" Version="14.10.0" />
<PackageReference Include="MediatR" Version="13.0.0"/>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.7"/>
<PackageReference Include="Swashbuckle.AspNetCore" Version="9.0.6"/>
Expand Down
6 changes: 4 additions & 2 deletions Api/Application/Common/Exceptions/ResultExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,10 @@ public static T EnsureSuccess<T>(this Result<T> result)
{
if (!result.IsSuccess)
{
var error = result.Error ?? new Error("unknown", "Unknown error");
throw new ApiException(StatusCodes.Status500InternalServerError, error.Message);
throw new ApiException(
StatusCodes.Status503ServiceUnavailable,
result.Error?.Message ?? "External service unavailable"
);
}

return result.Value!;
Expand Down
2 changes: 2 additions & 0 deletions Api/Application/Common/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,8 @@ public static WebApplicationBuilder AddInfrastructureServices(this WebApplicatio
builder.Services.AddScoped<IUserTable, UserTable>();
builder.Services.AddScoped<IUsersTasksTable, UsersTasksTable>();
builder.Services.AddScoped<IMetricsTable, MetricsTable>();
builder.Services.AddScoped<ITaskEvent, RandomTaskEvent>();


return builder;
}
Expand Down
8 changes: 4 additions & 4 deletions Api/Application/Features/Auth/Refresh/RefreshHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,16 @@

namespace Api.Application.Features.Auth.Refresh;

public class RefreshHandler(IUserTable users, IPasswordHasher hasher, ITokenService tokenService)
public class RefreshHandler(ITokenService tokenService)
: IRequestHandler<RefreshCommand, RefreshResponse>
{
public async Task<RefreshResponse> Handle(RefreshCommand command,
public Task<RefreshResponse> Handle(RefreshCommand command,
CancellationToken cancellationToken)
{
var username = command.Username;
return new RefreshResponse(
return Task.FromResult(new RefreshResponse(
tokenService.GenerateAccessToken(username),
tokenService.GenerateRefreshToken(username)
);
));
}
}
Original file line number Diff line number Diff line change
@@ -1,24 +1,29 @@
using Infrastructure.DataAccess;
using Infrastructure.Interfaces;
using MediatR;
using Shared.Models.Enums;

namespace Api.Application.Features.Moderation.ApproveTask;

public class ChangeTaskStatusHandler(IUsersTasksTable tasks, IUserTable users) : IRequestHandler<ChangeTaskStatusQuery, bool>
public class ChangeTaskStatusHandler(IUsersTasksTable tasks, IUserTable users)
: IRequestHandler<ChangeTaskStatusQuery, bool>
{
public async Task<bool> Handle(ChangeTaskStatusQuery request, CancellationToken cancellationToken)
{
var userTaskId = request.UserTaskId;

var user = await users.GetUser(request.UserTaskId);
var reward = await tasks.GetReward(request.UserTaskId);
if (request.Status == ModerationStatus.Approved)
{
var reward = await tasks.GetReward(userTaskId);

await tasks.SetCompleted(userTaskId);
await users.ChangeExperience(userTaskId, 1);
await users.TryChangeLevel(userTaskId);
await users.ChangeMoney(userTaskId, reward);
await users.AddMoney(user.Username, reward);
if ((user.Experience + 1) % 5 == 0)
{
await users.AddLevel(user.Username, 1);
await users.AddExperience(user.Username, -4);
}
else
await users.AddExperience(user.Username, 1);
}
return await tasks.ChangeModerationStatus(userTaskId, request.Status);

return await tasks.ChangeModerationStatus(request.UserTaskId, request.Status);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ public async Task<IActionResult> CheckModerator(long tgUserId)
/// approve task
/// </summary>
[HttpPost("{userTaskId:int}/approve")]
[Authorize(Roles = UserRoleNames.TgBot)]
// [Authorize(Roles = UserRoleNames.TgBot)]
public async Task<IActionResult> ApproveTask(int userTaskId)
{
if (userTaskId == -1)
Expand Down
15 changes: 13 additions & 2 deletions Api/Application/Features/Photos/UploadPhoto/UploadPhotoHandler.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Amazon.S3;
using Amazon.S3.Model;
using ImageMagick;
using MediatR;
using Microsoft.Extensions.Options;
using Shared.Models.Configs;
Expand All @@ -23,8 +24,18 @@ public async Task<string> Handle(UploadPhotoCommand request, CancellationToken c
{
var file = request.File;

await using var inputStream = file.OpenReadStream();
using var image = new MagickImage(inputStream);

image.Quality = 75;
image.Strip();

await using var compressedStream = new MemoryStream();
await image.WriteAsync(compressedStream, cancellationToken);
compressedStream.Position = 0;

var fileName = $"{Guid.NewGuid()}{Path.GetExtension(file.FileName)}";
var contentType = file.ContentType;
const string contentType = "image/jpeg";

var buckets = await s3Client.ListBucketsAsync(cancellationToken);
if (buckets.Buckets.All(b => b.BucketName != bucket))
Expand All @@ -41,7 +52,7 @@ public async Task<string> Handle(UploadPhotoCommand request, CancellationToken c
{
BucketName = bucket,
Key = fileName,
InputStream = stream,
InputStream = compressedStream,
ContentType = contentType
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@

namespace Api.Application.Features.Tasks.ChangeTask;

public class ChangeTaskHandler(IUsersTasksTable tasks, IUserTable users, IMetricsTable metrics)
public class ChangeTaskHandler(IUsersTasksTable tasks, IUserTable users, IMetricsTable metrics, ITaskEvent taskEvent)
: IRequestHandler<ChangeTaskQuery, TaskModel>
{
private const double Coefficient = 0.2;
Expand All @@ -14,10 +14,10 @@ public async Task<TaskModel> Handle(ChangeTaskQuery request, CancellationToken c
{
var username = request.Username;
var taskId = request.TaskId;

var newTask = await tasks.ChangeUserTask(taskId);
//TODO потом перепишу и это надо в service
var newTask = await taskEvent.ChangeUserTask(taskId);
var reward = tasks.GetReward(taskId);
await users.ChangeMoney(taskId, -(int)(reward.Result * Coefficient));
await users.AddMoney(username, -(int)(reward.Result * Coefficient));

await metrics.AddRecord(username, MetricType.Change);
return newTask;
Expand Down
4 changes: 3 additions & 1 deletion Api/Application/Features/Tasks/GetTask/GetTaskHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ public class GetTaskHandler(IUsersTasksTable tasks) : IRequestHandler<GetTaskQue
public async Task<TaskModel> Handle(GetTaskQuery request, CancellationToken cancellationToken)
{
var task = await tasks.GetTaskFullInfo(request.TaskId);
return task ?? throw new ApiException(StatusCodes.Status404NotFound, $"Task {request.TaskId} for {request.Username} not found");
return task ??
throw new ApiException(StatusCodes.Status404NotFound,
$"Task {request.TaskId} for {request.Username} not found");
}
}
9 changes: 5 additions & 4 deletions Api/Application/Features/Tasks/GetTasks/GetTasksHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,21 @@

namespace Api.Application.Features.Tasks.GetTasks;

public class GetTasksHandler(IUsersTasksTable tasks) : IRequestHandler<GetTasksQuery, List<TaskModel>>
public class GetTasksHandler(IUsersTasksTable tasks, ITaskEvent taskEvent) : IRequestHandler<GetTasksQuery, List<TaskModel>>
{
public async Task<List<TaskModel>> Handle(GetTasksQuery request,
CancellationToken cancellationToken)
{
var username = request.Username;
var tasksList = await tasks.GetListActiveUserTasks(username);

while (tasksList.Count != 4)
while (tasksList.Count < 4)
{
var task = await tasks.AddUserTask(username);
var task = await taskEvent.AddUserTask(username);
tasksList.Add(task);
await Task.Delay(200, cancellationToken);
}

return tasksList;
}
}
11 changes: 6 additions & 5 deletions Api/Application/Features/Tasks/SubmitTask/SubmitTaskHandler.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,22 +5,23 @@

namespace Api.Application.Features.Tasks.SubmitTask;

public class SubmitTaskHandler(IUsersTasksTable tasks,IMetricsTable metrics, IMediator mediator)
public class SubmitTaskHandler(IUsersTasksTable tasks, IMetricsTable metrics, IMediator mediator)
: IRequestHandler<SubmitTaskQuery, List<string>>
{
public async Task<List<string>> Handle(SubmitTaskQuery request, CancellationToken cancellationToken)
{
var uploadedNames = new List<string>();
var username = request.Username;
var taskId = request.TaskId;

foreach (var file in request.Files)
var files = request.Files;
foreach (var file in files)
{
var name = await mediator.Send(new UploadPhotoCommand(file), cancellationToken);
await tasks.AddPhoto(taskId, name);
uploadedNames.Add(name);
}


await tasks.SetPhotos(taskId, uploadedNames.ToArray());

await tasks.ChangeModerationStatus(taskId, ModerationStatus.Waiting);

await metrics.AddRecord(username, MetricType.Submit);
Expand Down
7 changes: 5 additions & 2 deletions Api/Application/Features/Weather/WeatherController.cs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Infrastructure.Interfaces;
using Api.Application.Common.Exceptions;
using Infrastructure.Interfaces;
using Microsoft.AspNetCore.Mvc;

namespace Api.Application.Features.Weather;
Expand All @@ -13,7 +14,9 @@ public class WeatherController(IWeatherApi weatherService) : ControllerBase
[HttpGet("current")]
public async Task<IActionResult> GetCurrentWeather(CancellationToken cancellationToken)
{
var weather = await weatherService.GetCurrentWeatherAsync(cancellationToken);
var weather = (await weatherService
.GetCurrentWeatherAsync(cancellationToken)).EnsureSuccess();

return Ok(weather);
}
}
3 changes: 2 additions & 1 deletion Api/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ COPY Api/Api.csproj Api/
COPY Application/Application.csproj Application/
COPY Infrastructure/Infrastructure.csproj Infrastructure/
COPY Client.Models/Client.Models.csproj Client.Models/
COPY Test/Test.csproj Test/

RUN dotnet restore Vibik.Server.sln
RUN dotnet restore Api/Api.csproj

COPY . .

Expand Down
2 changes: 1 addition & 1 deletion Api/appsettings.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
},
"AllowedHosts": "*",
"JwtSettings": {
"ExpiresAccess": "00:02:00",
"ExpiresAccess": "00:20:00",
"ExpiresRefresh": "1.00:00:00",
"SecretKey": "JwtSecretKey",
"AllowNonExpiringTokens": true
Expand Down
4 changes: 4 additions & 0 deletions Client.Models/Client.Models.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,4 +7,8 @@
<RootNamespace>Shared</RootNamespace>
</PropertyGroup>

<ItemGroup>
<Folder Include="Models\Common\" />
</ItemGroup>

</Project>
6 changes: 3 additions & 3 deletions Client.Models/Models/Entities/User.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ public class User
{
public required string Username { get; set; }
public required string DisplayName { get; set; }
public int Level { get; set; } = 0;
public int Experience { get; set; } = 0;
public int Money { get; set; } = 0;
public int Level { get; set; }
public int Experience { get; set; }
public int Money { get; set; }
}
Loading
Loading