feature/3-git-content-database #8
@ -4,7 +4,7 @@
|
|||||||
"minimum-stability": "stable",
|
"minimum-stability": "stable",
|
||||||
"prefer-stable": true,
|
"prefer-stable": true,
|
||||||
"require": {
|
"require": {
|
||||||
"php": ">=8.2",
|
"php": ">=8.3",
|
||||||
"ext-ctype": "*",
|
"ext-ctype": "*",
|
||||||
"ext-iconv": "*",
|
"ext-iconv": "*",
|
||||||
"czproject/git-php": "^4.1",
|
"czproject/git-php": "^4.1",
|
||||||
@ -21,6 +21,7 @@
|
|||||||
"symfony/runtime": "7.0.*",
|
"symfony/runtime": "7.0.*",
|
||||||
"symfony/security-bundle": "7.0.*",
|
"symfony/security-bundle": "7.0.*",
|
||||||
"symfony/twig-bundle": "7.0.*",
|
"symfony/twig-bundle": "7.0.*",
|
||||||
|
"symfony/uid": "7.0.*",
|
||||||
"symfony/validator": "7.0.*",
|
"symfony/validator": "7.0.*",
|
||||||
"symfony/yaml": "7.0.*",
|
"symfony/yaml": "7.0.*",
|
||||||
"twig/extra-bundle": "^2.12|^3.0",
|
"twig/extra-bundle": "^2.12|^3.0",
|
||||||
|
162
composer.lock
generated
162
composer.lock
generated
@ -4,7 +4,7 @@
|
|||||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||||
"This file is @generated automatically"
|
"This file is @generated automatically"
|
||||||
],
|
],
|
||||||
"content-hash": "81c31aacf558fbbb42aaa93138c76e40",
|
"content-hash": "0d9cbf5f6f95b13006484d60ccb4d67c",
|
||||||
"packages": [
|
"packages": [
|
||||||
{
|
{
|
||||||
"name": "czproject/git-php",
|
"name": "czproject/git-php",
|
||||||
@ -4097,6 +4097,88 @@
|
|||||||
],
|
],
|
||||||
"time": "2023-08-16T06:22:46+00:00"
|
"time": "2023-08-16T06:22:46+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/polyfill-uuid",
|
||||||
|
"version": "v1.28.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/polyfill-uuid.git",
|
||||||
|
"reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/9c44518a5aff8da565c8a55dbe85d2769e6f630e",
|
||||||
|
"reference": "9c44518a5aff8da565c8a55dbe85d2769e6f630e",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=7.1"
|
||||||
|
},
|
||||||
|
"provide": {
|
||||||
|
"ext-uuid": "*"
|
||||||
|
},
|
||||||
|
"suggest": {
|
||||||
|
"ext-uuid": "For best performance"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"extra": {
|
||||||
|
"branch-alias": {
|
||||||
|
"dev-main": "1.28-dev"
|
||||||
|
},
|
||||||
|
"thanks": {
|
||||||
|
"name": "symfony/polyfill",
|
||||||
|
"url": "https://github.com/symfony/polyfill"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"autoload": {
|
||||||
|
"files": [
|
||||||
|
"bootstrap.php"
|
||||||
|
],
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Polyfill\\Uuid\\": ""
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Grégoire Pineau",
|
||||||
|
"email": "lyrixx@lyrixx.info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Symfony polyfill for uuid functions",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"compatibility",
|
||||||
|
"polyfill",
|
||||||
|
"portable",
|
||||||
|
"uuid"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/symfony/polyfill-uuid/tree/v1.28.0"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://symfony.com/sponsor",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/fabpot",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2023-01-26T09:26:14+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/property-access",
|
"name": "symfony/property-access",
|
||||||
"version": "v7.0.0",
|
"version": "v7.0.0",
|
||||||
@ -5265,6 +5347,80 @@
|
|||||||
],
|
],
|
||||||
"time": "2023-11-26T15:16:53+00:00"
|
"time": "2023-11-26T15:16:53+00:00"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "symfony/uid",
|
||||||
|
"version": "v7.0.0",
|
||||||
|
"source": {
|
||||||
|
"type": "git",
|
||||||
|
"url": "https://github.com/symfony/uid.git",
|
||||||
|
"reference": "9472fe6a4a2adcc9150106ebb9fde328828d312f"
|
||||||
|
},
|
||||||
|
"dist": {
|
||||||
|
"type": "zip",
|
||||||
|
"url": "https://api.github.com/repos/symfony/uid/zipball/9472fe6a4a2adcc9150106ebb9fde328828d312f",
|
||||||
|
"reference": "9472fe6a4a2adcc9150106ebb9fde328828d312f",
|
||||||
|
"shasum": ""
|
||||||
|
},
|
||||||
|
"require": {
|
||||||
|
"php": ">=8.2",
|
||||||
|
"symfony/polyfill-uuid": "^1.15"
|
||||||
|
},
|
||||||
|
"require-dev": {
|
||||||
|
"symfony/console": "^6.4|^7.0"
|
||||||
|
},
|
||||||
|
"type": "library",
|
||||||
|
"autoload": {
|
||||||
|
"psr-4": {
|
||||||
|
"Symfony\\Component\\Uid\\": ""
|
||||||
|
},
|
||||||
|
"exclude-from-classmap": [
|
||||||
|
"/Tests/"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"notification-url": "https://packagist.org/downloads/",
|
||||||
|
"license": [
|
||||||
|
"MIT"
|
||||||
|
],
|
||||||
|
"authors": [
|
||||||
|
{
|
||||||
|
"name": "Grégoire Pineau",
|
||||||
|
"email": "lyrixx@lyrixx.info"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Nicolas Grekas",
|
||||||
|
"email": "p@tchwork.com"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Symfony Community",
|
||||||
|
"homepage": "https://symfony.com/contributors"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"description": "Provides an object-oriented API to generate and represent UIDs",
|
||||||
|
"homepage": "https://symfony.com",
|
||||||
|
"keywords": [
|
||||||
|
"UID",
|
||||||
|
"ulid",
|
||||||
|
"uuid"
|
||||||
|
],
|
||||||
|
"support": {
|
||||||
|
"source": "https://github.com/symfony/uid/tree/v7.0.0"
|
||||||
|
},
|
||||||
|
"funding": [
|
||||||
|
{
|
||||||
|
"url": "https://symfony.com/sponsor",
|
||||||
|
"type": "custom"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://github.com/fabpot",
|
||||||
|
"type": "github"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
|
||||||
|
"type": "tidelift"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"time": "2023-10-31T08:22:02+00:00"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "symfony/validator",
|
"name": "symfony/validator",
|
||||||
"version": "v7.0.0",
|
"version": "v7.0.0",
|
||||||
@ -6149,10 +6305,10 @@
|
|||||||
"prefer-stable": true,
|
"prefer-stable": true,
|
||||||
"prefer-lowest": false,
|
"prefer-lowest": false,
|
||||||
"platform": {
|
"platform": {
|
||||||
"php": ">=8.2",
|
"php": ">=8.3",
|
||||||
"ext-ctype": "*",
|
"ext-ctype": "*",
|
||||||
"ext-iconv": "*"
|
"ext-iconv": "*"
|
||||||
},
|
},
|
||||||
"platform-dev": [],
|
"platform-dev": [],
|
||||||
"plugin-api-version": "2.6.0"
|
"plugin-api-version": "2.3.0"
|
||||||
}
|
}
|
||||||
|
4
config/packages/uid.yaml
Normal file
4
config/packages/uid.yaml
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
framework:
|
||||||
|
uid:
|
||||||
|
default_uuid_version: 7
|
||||||
|
time_based_uuid_version: 7
|
@ -27,6 +27,9 @@ class Snip
|
|||||||
#[ORM\OneToMany(mappedBy: 'snip', targetEntity: SnipContent::class, orphanRemoval: true)]
|
#[ORM\OneToMany(mappedBy: 'snip', targetEntity: SnipContent::class, orphanRemoval: true)]
|
||||||
private Collection $snipContents;
|
private Collection $snipContents;
|
||||||
|
|
||||||
|
#[ORM\Column(length: 255, nullable: true)]
|
||||||
|
private ?string $activeCommit = null;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->snipContents = new ArrayCollection();
|
$this->snipContents = new ArrayCollection();
|
||||||
@ -95,4 +98,16 @@ class Snip
|
|||||||
|
|
||||||
return $this;
|
return $this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function getActiveCommit(): ?string
|
||||||
|
{
|
||||||
|
return $this->activeCommit;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function setActiveCommit(?string $activeCommit): static
|
||||||
|
{
|
||||||
|
$this->activeCommit = $activeCommit;
|
||||||
|
|
||||||
|
return $this;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -7,6 +7,7 @@ use Doctrine\Common\Collections\ArrayCollection;
|
|||||||
use Doctrine\Common\Collections\Collection;
|
use Doctrine\Common\Collections\Collection;
|
||||||
use Doctrine\DBAL\Types\Types;
|
use Doctrine\DBAL\Types\Types;
|
||||||
use Doctrine\ORM\Mapping as ORM;
|
use Doctrine\ORM\Mapping as ORM;
|
||||||
|
use Symfony\Component\Uid\Ulid;
|
||||||
|
|
||||||
#[ORM\Entity(repositoryClass: SnipContentRepository::class)]
|
#[ORM\Entity(repositoryClass: SnipContentRepository::class)]
|
||||||
class SnipContent
|
class SnipContent
|
||||||
@ -14,27 +15,27 @@ class SnipContent
|
|||||||
#[ORM\Id]
|
#[ORM\Id]
|
||||||
#[ORM\GeneratedValue]
|
#[ORM\GeneratedValue]
|
||||||
#[ORM\Column]
|
#[ORM\Column]
|
||||||
private ?int $id = null;
|
private ?Ulid $id = null;
|
||||||
|
|
||||||
#[ORM\ManyToOne(inversedBy: 'snipContents')]
|
#[ORM\ManyToOne(inversedBy: 'snipContents')]
|
||||||
#[ORM\JoinColumn(nullable: false)]
|
#[ORM\JoinColumn(nullable: false)]
|
||||||
private ?Snip $snip = null;
|
private ?Snip $snip = null;
|
||||||
|
|
||||||
#[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'child')]
|
#[ORM\ManyToOne(targetEntity: self::class, inversedBy: 'children')]
|
||||||
private ?self $parent = null;
|
private ?self $parent = null;
|
||||||
|
|
||||||
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class)]
|
#[ORM\OneToMany(mappedBy: 'parent', targetEntity: self::class)]
|
||||||
private Collection $child;
|
private Collection $children;
|
||||||
|
|
||||||
#[ORM\Column(type: Types::TEXT, nullable: true)]
|
#[ORM\Column(type: Types::TEXT, nullable: true)]
|
||||||
private ?string $text = null;
|
private ?string $text = null;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
{
|
{
|
||||||
$this->child = new ArrayCollection();
|
$this->children = new ArrayCollection();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getId(): ?int
|
public function getId(): ?Ulid
|
||||||
{
|
{
|
||||||
return $this->id;
|
return $this->id;
|
||||||
}
|
}
|
||||||
@ -66,15 +67,15 @@ class SnipContent
|
|||||||
/**
|
/**
|
||||||
* @return Collection<int, self>
|
* @return Collection<int, self>
|
||||||
*/
|
*/
|
||||||
public function getChild(): Collection
|
public function getChildren(): Collection
|
||||||
{
|
{
|
||||||
return $this->child;
|
return $this->children;
|
||||||
}
|
}
|
||||||
|
|
||||||
public function addChild(self $child): self
|
public function addChild(self $child): self
|
||||||
{
|
{
|
||||||
if (!$this->child->contains($child)) {
|
if (!$this->children->contains($child)) {
|
||||||
$this->child->add($child);
|
$this->children->add($child);
|
||||||
$child->setParent($this);
|
$child->setParent($this);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -83,7 +84,7 @@ class SnipContent
|
|||||||
|
|
||||||
public function removeChild(self $child): self
|
public function removeChild(self $child): self
|
||||||
{
|
{
|
||||||
if ($this->child->removeElement($child)) {
|
if ($this->children->removeElement($child)) {
|
||||||
// set the owning side to null (unless already changed)
|
// set the owning side to null (unless already changed)
|
||||||
if ($child->getParent() === $this) {
|
if ($child->getParent() === $this) {
|
||||||
$child->setParent(null);
|
$child->setParent(null);
|
||||||
|
@ -5,17 +5,15 @@ namespace App\Service\SnipContent;
|
|||||||
use App\Entity\Snip;
|
use App\Entity\Snip;
|
||||||
use App\Entity\SnipContent;
|
use App\Entity\SnipContent;
|
||||||
use App\Entity\User;
|
use App\Entity\User;
|
||||||
use App\Repository\SnipContentRepository;
|
use Doctrine\ORM\EntityManagerInterface;
|
||||||
|
|
||||||
class SnipContentDB implements SnipContentInterface
|
readonly class SnipContentDB implements SnipContentInterface
|
||||||
{
|
{
|
||||||
public function __construct(
|
public function __construct(
|
||||||
private readonly Snip $snip,
|
private Snip $snip,
|
||||||
private readonly User $user,
|
private User $user,
|
||||||
private readonly SnipContentRepository $repo,
|
private EntityManagerInterface $em,
|
||||||
)
|
) {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
public function update(string $snipContents): void
|
public function update(string $snipContents): void
|
||||||
{
|
{
|
||||||
@ -27,7 +25,12 @@ class SnipContentDB implements SnipContentInterface
|
|||||||
$content->setParent($this->snip->getSnipContents()->last());
|
$content->setParent($this->snip->getSnipContents()->last());
|
||||||
}
|
}
|
||||||
|
|
||||||
$this->repo->save($content);
|
$this->em->persist($content);
|
||||||
|
$this->em->flush();
|
||||||
|
|
||||||
|
$this->snip->setActiveCommit($content->getId());
|
||||||
|
$this->em->persist($this->snip);
|
||||||
|
$this->em->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function get(): string
|
public function get(): string
|
||||||
@ -44,14 +47,14 @@ class SnipContentDB implements SnipContentInterface
|
|||||||
|
|
||||||
public function setCommit(string $commit): void
|
public function setCommit(string $commit): void
|
||||||
{
|
{
|
||||||
// return to previous history commit
|
$this->snip->setActiveCommit($commit);
|
||||||
// maybe store the current commit in the snip content
|
$this->em->persist($this->snip);
|
||||||
|
$this->em->flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
public function getCommit(): string
|
public function getCommit(): string
|
||||||
{
|
{
|
||||||
// return the current commit
|
return $this->snip->getActiveCommit();
|
||||||
return '';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public function delete(): void
|
public function delete(): void
|
||||||
|
12
symfony.lock
12
symfony.lock
@ -140,6 +140,18 @@
|
|||||||
"templates/base.html.twig"
|
"templates/base.html.twig"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
"symfony/uid": {
|
||||||
|
"version": "7.0",
|
||||||
|
"recipe": {
|
||||||
|
"repo": "github.com/symfony/recipes",
|
||||||
|
"branch": "main",
|
||||||
|
"version": "6.2",
|
||||||
|
"ref": "d294ad4add3e15d7eb1bae0221588ca89b38e558"
|
||||||
|
},
|
||||||
|
"files": [
|
||||||
|
"config/packages/uid.yaml"
|
||||||
|
]
|
||||||
|
},
|
||||||
"symfony/validator": {
|
"symfony/validator": {
|
||||||
"version": "6.2",
|
"version": "6.2",
|
||||||
"recipe": {
|
"recipe": {
|
||||||
|
Loading…
Reference in New Issue
Block a user