I’m developing a chat app. I have users, services, chat and service providers.
I’m currently unable to create a chat, so I need help. I leave code below and also some outputs that they give me.
The definition is to list all created services. In other words, when creating a chat I can choose a service that you create which will then be automatically assigned to a provider that has that serviceid
ChatController
:
using Microsoft.AspNetCore.Mvc;
using HTE.Data;
using HTE.Models;
using System.Linq;
using System;
using System.Diagnostics;
using Microsoft.AspNetCore.Mvc.Rendering;
namespace HTE.Controllers
{
public class ChatController : Controller
{
private readonly HTEDbContext _context;
private readonly ILogger<ChatController> _logger; // Injetar o logger
public ChatController(HTEDbContext context, ILogger<ChatController> logger)
{
_context = context;
_logger = logger;
}
[HttpGet]
public IActionResult CreateChat()
{
var model = new ChatViewModel
{
Servicos = _context.Servicos.ToList() // Pega diretamente a lista de serviços
};
return View(model);
}
[HttpPost]
[ValidateAntiForgeryToken]
public IActionResult CreateChat(ChatViewModel model)
{
if (!ModelState.IsValid)
{
foreach (var modelState in ModelState)
{
foreach (var error in modelState.Value.Errors)
{
_logger.LogError($"Erro no campo {modelState.Key}: {error.ErrorMessage}");
}
}
model.Servicos = _context.Servicos.ToList();
return View(model);
}
try
{
// Processar a criação do chat (lógica para gravar o chat na BD)
var utilizadorID = int.Parse(User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value);
var prestadores = _context.PrestadorDeServicos
.Where(p => p.ServicoID == model.ServicoID)
.ToList();
if (!prestadores.Any())
{
_logger.LogWarning("Nenhum prestador disponível para o serviço selecionado.");
model.Servicos = _context.Servicos.ToList();
return View(model);
}
var random = new Random();
var prestadorAleatorio = prestadores[random.Next(prestadores.Count)];
var chat = new Chat
{
UtilizadorID = utilizadorID,
PrestadorDeServicosID = prestadorAleatorio.PrestadorDeServicosID,
NomeChat = model.NomeChat,
DataCriacao = DateTime.Now
};
_context.Chat.Add(chat);
_context.SaveChanges();
return RedirectToAction("Index", "Chat");
}
catch (Exception ex)
{
_logger.LogError($"Erro ao criar o chat: {ex.Message}");
model.Servicos = _context.Servicos.ToList();
return View(model);
}
}
// GET: /Chat/Index
[HttpGet]
public IActionResult Index()
{
if (User.Identity.IsAuthenticated) // Verifica se o utilizador está autenticado
{
var utilizadorIDClaim = User.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier);
if (utilizadorIDClaim != null)
{
var utilizadorID = int.Parse(utilizadorIDClaim.Value);
var chats = _context.Chat
.Where(c => c.UtilizadorID == utilizadorID)
.ToList();
return View(chats);
}
else
{
// Caso o claim não esteja presente
Console.WriteLine("Claim 'NameIdentifier' não encontrado.");
return RedirectToAction("Login", "Account"); // Redireciona para a página de login
}
}
else
{
// Redireciona para a página de login caso não esteja autenticado
return RedirectToAction("Login", "Account");
}
}
}
}
Service model:
using System.ComponentModel.DataAnnotations.Schema;
namespace HTE.Models
{
public class Servicos
{
public int ServicoID { get; set; } // Esta será a chave primária
public string NomeServico { get; set; }
}
}
Chat model:
using Microsoft.AspNet.SignalR.Messaging;
namespace HTE.Models
{
public class Chat
{
public int ChatID { get; set; }
public string NomeChat { get; set; }
public DateTime DataCriacao { get; set; }
public List<Mensagem> Mensagens { get; set; }
// Chaves estrangeiras
public int UtilizadorID { get; set; } // Chave estrangeira
public Utilizador Utilizador { get; set; } // Navegação para o Utilizador
public int PrestadorDeServicosID { get; set; } // Chave estrangeira
public PrestadorDeServicos PrestadorDeServicos { get; set; } // Navegação para o Prestador de Serviços
}
}
CreateChat.cshtml
:
@model HTE.Models.ChatViewModel
<form asp-action="CreateChat" method="post">
<div class="form-group">
<label asp-for="NomeChat"></label>
<input asp-for="NomeChat" class="form-control" />
<span asp-validation-for="NomeChat" class="text-danger"></span>
</div>
<div class="form-group">
<label asp-for="ServicoID"></label>
<select asp-for="ServicoID" class="form-control">
<option value="">Selecione um serviço</option>
@foreach (var servicos in Model.Servicos)
{
<option value="@servicos.ServicoID">@servicos.NomeServico</option>
}
</select>
<span asp-validation-for="ServicoID" class="text-danger"></span>
</div>
<button type="submit" class="btn btn-primary">Criar Chat</button>
</form>
SQL Server tables:
CREATE TABLE [dbo].[Chat]
(
[ChatID] INT IDENTITY (1, 1) NOT NULL,
[UtilizadorID] INT NOT NULL,
[PrestadorDeServicosID] INT NOT NULL,
[DataCriacao] DATETIME DEFAULT (getdate()) NULL,
[NomeChat] NVARCHAR(255) NOT NULL,
PRIMARY KEY CLUSTERED ([ChatID] ASC),
FOREIGN KEY ([UtilizadorID])
REFERENCES [dbo].[Utilizador] ([UtilizadorID]),
FOREIGN KEY ([PrestadorDeServicosID])
REFERENCES [dbo].[PrestadorDeServicos] ([PrestadorDeServicosID])
);
CREATE TABLE [dbo].[Servicos]
(
[ServicoID] INT IDENTITY (1, 1) NOT NULL,
[NomeServico] NVARCHAR(100) NOT NULL,
PRIMARY KEY CLUSTERED ([ServicoID] ASC)
);
Output:
When I click on the button to create chat, it gives these values
fail: HTE.Controllers.ChatController\Erro no campo Servicos: The Servicos field is required. (https://i.sstatic.net/GJBy6PQE.png)
What are you supposed to do? When you click on the create chat button, the chat is created and saved in the database, thank you for helping me!
I used chatgpt to help solve the problem, but I still couldn’t