use dev\winterframework\doctrine\dbal\DbalTransactionManager;
use dev\winterframework\stereotype\Autowired;
use dev\winterframework\stereotype\Service;
use dev\winterframework\txn\support\DefaultTransactionDefinition;
use dev\winterframework\util\log\Wlf4p;
use Doctrine\DBAL\Connection;
#[Service]
class UserDbalService {
use Wlf4p;
#[Autowired("defaultdb-doctrine-dbal")]
private Connection $conn;
#[Autowired("defaultdb-doctrine-dbaltxn")]
private DbalTransactionManager $txnManager;
public function createUser(User $user): User
{
$status = $this->txnManager->getTransaction(new DefaultTransactionDefinition());
try {
$this->conn->executeStatement(
"INSERT INTO doctrine_users (name, email, age) VALUES (:name, :email, :age)",
['name' => $user->getName(), 'email' => $user->getEmail(), 'age' => $user->getAge()]
);
$user->setId((int) $this->conn->lastInsertId());
$this->txnManager->commit($status);
return $user;
} catch (\Throwable $e) {
$this->txnManager->rollback($status);
throw $e;
}
}
public function updateUser(User $user): User
{
$status = $this->txnManager->getTransaction(new DefaultTransactionDefinition());
try {
$this->conn->executeStatement(
"UPDATE doctrine_users SET name = :name, email = :email, age = :age WHERE id = :id",
['name' => $user->getName(), 'email' => $user->getEmail(), 'age' => $user->getAge(), 'id' => $user->getId()]
);
$this->txnManager->commit($status);
return $user;
} catch (\Throwable $e) {
$this->txnManager->rollback($status);
throw $e;
}
}
public function deleteUser(int $id): bool
{
$status = $this->txnManager->getTransaction(new DefaultTransactionDefinition());
try {
$affected = $this->conn->executeStatement(
"DELETE FROM doctrine_users WHERE id = :id",
['id' => $id]
);
$this->txnManager->commit($status);
return $affected > 0;
} catch (\Throwable $e) {
$this->txnManager->rollback($status);
throw $e;
}
}
public function findById(int $id): ?User
{
$row = $this->conn->fetchAssociative(
"SELECT * FROM doctrine_users WHERE id = :id",
['id' => $id]
);
if (!$row) return null;
return new User((int) $row['id'], $row['name'], $row['email'], isset($row['age']) ? (int) $row['age'] : null);
}
public function findAll(): array
{
$rows = $this->conn->fetchAllAssociative("SELECT * FROM doctrine_users ORDER BY id");
$users = [];
foreach ($rows as $row) {
$users[] = new User((int) $row['id'], $row['name'], $row['email'], isset($row['age']) ? (int) $row['age'] : null);
}
return $users;
}
public function findByEmail(string $email): ?User
{
$row = $this->conn->fetchAssociative(
"SELECT * FROM doctrine_users WHERE email = :email",
['email' => $email]
);
if (!$row) return null;
return new User((int) $row['id'], $row['name'], $row['email'], isset($row['age']) ? (int) $row['age'] : null);
}
}