1
0
Fork 0
mirror of https://github.com/wallabag/wallabag.git synced 2025-06-27 16:36:00 +00:00

Merge pull request #8120 from wallabag/migrate-to-doctrine-attributes

Migrate to Doctrine attributes
This commit is contained in:
Yassine Guedidi 2025-04-05 18:09:31 +02:00 committed by GitHub
commit 27a93cc281
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
16 changed files with 201 additions and 334 deletions

View file

@ -78,7 +78,7 @@ doctrine:
auto_mapping: true
mappings:
Wallabag:
type: annotation
type: attribute
is_bundle: false
dir: '%kernel.project_dir%/src/Entity'
prefix: 'Wallabag\Entity'

View file

@ -10,49 +10,46 @@ use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\VirtualProperty;
use Symfony\Component\Validator\Constraints as Assert;
use Wallabag\Helper\EntityTimestampsTrait;
use Wallabag\Repository\AnnotationRepository;
/**
* Annotation.
*
* @ORM\Table(name="annotation")
* @ORM\Entity(repositoryClass="Wallabag\Repository\AnnotationRepository")
* @ORM\HasLifecycleCallbacks()
* @ExclusionPolicy("none")
*/
#[ORM\Table(name: 'annotation')]
#[ORM\Entity(repositoryClass: AnnotationRepository::class)]
#[ORM\HasLifecycleCallbacks]
class Annotation
{
use EntityTimestampsTrait;
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
* @var string
*
* @ORM\Column(name="text", type="text")
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'text', type: 'text')]
private $text;
/**
* @var \DateTime
*
* @ORM\Column(name="created_at", type="datetime")
*/
#[ORM\Column(name: 'created_at', type: 'datetime')]
private $createdAt;
/**
* @var \DateTime
*
* @ORM\Column(name="updated_at", type="datetime")
*/
#[ORM\Column(name: 'updated_at', type: 'datetime')]
private $updatedAt;
/**
@ -62,34 +59,31 @@ class Annotation
* max = 10000,
* maxMessage = "validator.quote_length_too_high"
* )
* @ORM\Column(name="quote", type="text")
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'quote', type: 'text')]
private $quote;
/**
* @var array
*
* @ORM\Column(name="ranges", type="array")
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'ranges', type: 'array')]
private $ranges;
/**
* @Exclude
*
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\User")
*/
#[ORM\ManyToOne(targetEntity: User::class)]
private $user;
/**
* @Exclude
*
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\Entry", inversedBy="annotations")
* @ORM\JoinColumn(name="entry_id", referencedColumnName="id", onDelete="cascade")
*/
#[ORM\JoinColumn(name: 'entry_id', referencedColumnName: 'id', onDelete: 'cascade')]
#[ORM\ManyToOne(targetEntity: Entry::class, inversedBy: 'annotations')]
private $entry;
/*

View file

@ -4,29 +4,22 @@ namespace Wallabag\Entity\Api;
use Doctrine\ORM\Mapping as ORM;
use FOS\OAuthServerBundle\Entity\AccessToken as BaseAccessToken;
use Wallabag\Entity\User;
/**
* @ORM\Table("oauth2_access_tokens")
* @ORM\Entity
*/
#[ORM\Table('oauth2_access_tokens')]
#[ORM\Entity]
class AccessToken extends BaseAccessToken
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Id]
#[ORM\Column(type: 'integer')]
#[ORM\GeneratedValue(strategy: 'AUTO')]
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\Api\Client", inversedBy="accessTokens")
* @ORM\JoinColumn(nullable=false)
*/
#[ORM\JoinColumn(nullable: false)]
#[ORM\ManyToOne(targetEntity: Client::class, inversedBy: 'accessTokens')]
protected $client;
/**
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
*/
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', onDelete: 'CASCADE')]
#[ORM\ManyToOne(targetEntity: User::class)]
protected $user;
}

View file

@ -4,29 +4,22 @@ namespace Wallabag\Entity\Api;
use Doctrine\ORM\Mapping as ORM;
use FOS\OAuthServerBundle\Entity\AuthCode as BaseAuthCode;
use Wallabag\Entity\User;
/**
* @ORM\Table("oauth2_auth_codes")
* @ORM\Entity
*/
#[ORM\Table('oauth2_auth_codes')]
#[ORM\Entity]
class AuthCode extends BaseAuthCode
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Id]
#[ORM\Column(type: 'integer')]
#[ORM\GeneratedValue(strategy: 'AUTO')]
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\Api\Client")
* @ORM\JoinColumn(nullable=false)
*/
#[ORM\JoinColumn(nullable: false)]
#[ORM\ManyToOne(targetEntity: Client::class)]
protected $client;
/**
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
*/
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', onDelete: 'CASCADE')]
#[ORM\ManyToOne(targetEntity: User::class)]
protected $user;
}

View file

@ -9,43 +9,34 @@ use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\VirtualProperty;
use OpenApi\Annotations as OA;
use Wallabag\Entity\User;
use Wallabag\Repository\Api\ClientRepository;
/**
* @ORM\Table("oauth2_clients")
* @ORM\Entity(repositoryClass="Wallabag\Repository\Api\ClientRepository")
*/
#[ORM\Table('oauth2_clients')]
#[ORM\Entity(repositoryClass: ClientRepository::class)]
class Client extends BaseClient
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Id]
#[ORM\Column(type: 'integer')]
#[ORM\GeneratedValue(strategy: 'AUTO')]
protected $id;
/**
* @var string
*
* @ORM\Column(name="name", type="text", nullable=false)
*
* @OA\Property(
* description="Name of the API client",
* type="string",
* example="Default Client",
* )
*
* @Groups({"user_api_with_client"})
*/
#[ORM\Column(name: 'name', type: 'text', nullable: false)]
protected $name;
/**
* @ORM\OneToMany(targetEntity="Wallabag\Entity\Api\RefreshToken", mappedBy="client", cascade={"remove"})
*/
#[ORM\OneToMany(targetEntity: RefreshToken::class, mappedBy: 'client', cascade: ['remove'])]
protected $refreshTokens;
/**
* @ORM\OneToMany(targetEntity="Wallabag\Entity\Api\AccessToken", mappedBy="client", cascade={"remove"})
*/
#[ORM\OneToMany(targetEntity: AccessToken::class, mappedBy: 'client', cascade: ['remove'])]
protected $accessTokens;
/**
@ -62,9 +53,7 @@ class Client extends BaseClient
*/
protected $secret;
/**
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\User", inversedBy="clients")
*/
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'clients')]
private $user;
public function __construct(User $user)

View file

@ -4,29 +4,22 @@ namespace Wallabag\Entity\Api;
use Doctrine\ORM\Mapping as ORM;
use FOS\OAuthServerBundle\Entity\RefreshToken as BaseRefreshToken;
use Wallabag\Entity\User;
/**
* @ORM\Table("oauth2_refresh_tokens")
* @ORM\Entity
*/
#[ORM\Table('oauth2_refresh_tokens')]
#[ORM\Entity]
class RefreshToken extends BaseRefreshToken
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Id]
#[ORM\Column(type: 'integer')]
#[ORM\GeneratedValue(strategy: 'AUTO')]
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\Api\Client", inversedBy="refreshTokens")
* @ORM\JoinColumn(nullable=false)
*/
#[ORM\JoinColumn(nullable: false)]
#[ORM\ManyToOne(targetEntity: Client::class, inversedBy: 'refreshTokens')]
protected $client;
/**
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id", onDelete="CASCADE")
*/
#[ORM\JoinColumn(name: 'user_id', referencedColumnName: 'id', onDelete: 'CASCADE')]
#[ORM\ManyToOne(targetEntity: User::class)]
protected $user;
}

View file

@ -6,18 +6,14 @@ use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use JMS\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
use Wallabag\Repository\ConfigRepository;
/**
* Config.
*
* @ORM\Entity(repositoryClass="Wallabag\Repository\ConfigRepository")
* @ORM\Table(
* name="`config`",
* indexes={
* @ORM\Index(columns={"feed_token"}),
* }
* )
*/
#[ORM\Table(name: '`config`')]
#[ORM\Index(columns: ['feed_token'])]
#[ORM\Entity(repositoryClass: ConfigRepository::class)]
class Config
{
public const REDIRECT_TO_HOMEPAGE = 0;
@ -26,12 +22,11 @@ class Config
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
@ -43,150 +38,134 @@ class Config
* max = 100000,
* maxMessage = "validator.item_per_page_too_high"
* )
* @ORM\Column(name="items_per_page", type="integer", nullable=false)
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'items_per_page', type: 'integer', nullable: false)]
private $itemsPerPage;
/**
* @var string
*
* @Assert\NotBlank()
* @ORM\Column(name="language", type="string", nullable=false)
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'language', type: 'string', nullable: false)]
private $language;
/**
* @var string|null
*
* @ORM\Column(name="feed_token", type="string", nullable=true)
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'feed_token', type: 'string', nullable: true)]
private $feedToken;
/**
* @var int|null
*
* @ORM\Column(name="feed_limit", type="integer", nullable=true)
* @Assert\Range(
* min = 1,
* max = 100000,
* maxMessage = "validator.feed_limit_too_high"
* )
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'feed_limit', type: 'integer', nullable: true)]
private $feedLimit;
/**
* @var float|null
*
* @ORM\Column(name="reading_speed", type="float", nullable=true)
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'reading_speed', type: 'float', nullable: true)]
private $readingSpeed;
/**
* @var string|null
*
* @ORM\Column(name="pocket_consumer_key", type="string", nullable=true)
*/
#[ORM\Column(name: 'pocket_consumer_key', type: 'string', nullable: true)]
private $pocketConsumerKey;
/**
* @var int|null
*
* @ORM\Column(name="action_mark_as_read", type="integer", nullable=true, options={"default" = 0})
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'action_mark_as_read', type: 'integer', nullable: true, options: ['default' => 0])]
private $actionMarkAsRead;
/**
* @var int|null
*
* @ORM\Column(name="list_mode", type="integer", nullable=true)
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'list_mode', type: 'integer', nullable: true)]
private $listMode;
/**
* @var int|null
*
* @ORM\Column(name="display_thumbnails", type="integer", nullable=true, options={"default" = 1})
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'display_thumbnails', type: 'integer', nullable: true, options: ['default' => 1])]
private $displayThumbnails;
/**
* @var string|null
*
* @ORM\Column(name="font", type="text", nullable=true)
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'font', type: 'text', nullable: true)]
private $font;
/**
* @var float|null
*
* @ORM\Column(name="fontsize", type="float", nullable=true)
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'fontsize', type: 'float', nullable: true)]
private $fontsize;
/**
* @var float|null
*
* @ORM\Column(name="line_height", type="float", nullable=true)
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'line_height', type: 'float', nullable: true)]
private $lineHeight;
/**
* @var float|null
*
* @ORM\Column(name="max_width", type="float", nullable=true)
*
* @Groups({"config_api"})
*/
#[ORM\Column(name: 'max_width', type: 'float', nullable: true)]
private $maxWidth;
/**
* @var string|null
*
* @ORM\Column(name="custom_css", type="text", nullable=true)
*/
#[ORM\Column(name: 'custom_css', type: 'text', nullable: true)]
private $customCSS;
/**
* @ORM\OneToOne(targetEntity="Wallabag\Entity\User", inversedBy="config")
*/
#[ORM\OneToOne(targetEntity: User::class, inversedBy: 'config')]
private $user;
/**
* @var ArrayCollection<TaggingRule>
*
* @ORM\OneToMany(targetEntity="Wallabag\Entity\TaggingRule", mappedBy="config", cascade={"remove"})
* @ORM\OrderBy({"id" = "ASC"})
*/
#[ORM\OneToMany(targetEntity: TaggingRule::class, mappedBy: 'config', cascade: ['remove'])]
#[ORM\OrderBy(['id' => 'ASC'])]
private $taggingRules;
/**
* @var ArrayCollection<IgnoreOriginUserRule>
*
* @ORM\OneToMany(targetEntity="Wallabag\Entity\IgnoreOriginUserRule", mappedBy="config", cascade={"remove"})
* @ORM\OrderBy({"id" = "ASC"})
*/
#[ORM\OneToMany(targetEntity: IgnoreOriginUserRule::class, mappedBy: 'config', cascade: ['remove'])]
#[ORM\OrderBy(['id' => 'ASC'])]
private $ignoreOriginRules;
/*

View file

@ -13,28 +13,25 @@ use JMS\Serializer\Annotation\XmlRoot;
use Symfony\Component\Validator\Constraints as Assert;
use Wallabag\Helper\EntityTimestampsTrait;
use Wallabag\Helper\UrlHasher;
use Wallabag\Repository\EntryRepository;
/**
* Entry.
*
* @XmlRoot("entry")
* @ORM\Entity(repositoryClass="Wallabag\Repository\EntryRepository")
* @ORM\Table(
* name="`entry`",
* indexes={
* @ORM\Index(columns={"created_at"}),
* @ORM\Index(columns={"uid"}),
* @ORM\Index(columns={"user_id", "hashed_url"}),
* @ORM\Index(columns={"user_id", "hashed_given_url"}),
* @ORM\Index(columns={"language", "user_id"}),
* @ORM\Index(columns={"user_id", "is_archived", "archived_at"}),
* @ORM\Index(columns={"user_id", "created_at"}),
* @ORM\Index(columns={"user_id", "is_starred", "starred_at"})
* }
* )
* @ORM\HasLifecycleCallbacks()
* @Hateoas\Relation("self", href = "expr('/api/entries/' ~ object.getId())")
*/
#[ORM\Table(name: '`entry`')]
#[ORM\Index(columns: ['created_at'])]
#[ORM\Index(columns: ['uid'])]
#[ORM\Index(columns: ['user_id', 'hashed_url'])]
#[ORM\Index(columns: ['user_id', 'hashed_given_url'])]
#[ORM\Index(columns: ['language', 'user_id'])]
#[ORM\Index(columns: ['user_id', 'is_archived', 'archived_at'])]
#[ORM\Index(columns: ['user_id', 'created_at'])]
#[ORM\Index(columns: ['user_id', 'is_starred', 'starred_at'])]
#[ORM\Entity(repositoryClass: EntryRepository::class)]
#[ORM\HasLifecycleCallbacks]
class Entry
{
use EntityTimestampsTrait;
@ -43,30 +40,27 @@ class Entry
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
* @var string|null
*
* @ORM\Column(name="uid", type="string", length=23, nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'uid', type: 'string', length: 23, nullable: true)]
private $uid;
/**
* @var string|null
*
* @ORM\Column(name="title", type="text", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'title', type: 'text', nullable: true)]
private $title;
/**
@ -78,17 +72,16 @@ class Entry
* @Assert\Url(
* message = "The url '{{ value }}' is not a valid url",
* )
* @ORM\Column(name="url", type="text", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'url', type: 'text', nullable: true)]
private $url;
/**
* @var string|null
*
* @ORM\Column(name="hashed_url", type="string", length=40, nullable=true)
*/
#[ORM\Column(name: 'hashed_url', type: 'string', length: 40, nullable: true)]
private $hashedUrl;
/**
@ -96,10 +89,9 @@ class Entry
*
* @var string|null
*
* @ORM\Column(name="origin_url", type="text", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'origin_url', type: 'text', nullable: true)]
private $originUrl;
/**
@ -107,17 +99,15 @@ class Entry
*
* @var string|null
*
* @ORM\Column(name="given_url", type="text", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'given_url', type: 'text', nullable: true)]
private $givenUrl;
/**
* @var string|null
*
* @ORM\Column(name="hashed_given_url", type="string", length=40, nullable=true)
*/
#[ORM\Column(name: 'hashed_given_url', type: 'string', length: 40, nullable: true)]
private $hashedGivenUrl;
/**
@ -125,19 +115,17 @@ class Entry
*
* @Exclude
*
* @ORM\Column(name="is_archived", type="boolean")
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'is_archived', type: 'boolean')]
private $isArchived = false;
/**
* @var \DateTimeInterface|null
*
* @ORM\Column(name="archived_at", type="datetime", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'archived_at', type: 'datetime', nullable: true)]
private $archivedAt;
/**
@ -145,135 +133,120 @@ class Entry
*
* @Exclude
*
* @ORM\Column(name="is_starred", type="boolean")
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'is_starred', type: 'boolean')]
private $isStarred = false;
/**
* @var string|null
*
* @ORM\Column(name="content", type="text", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'content', type: 'text', nullable: true)]
private $content;
/**
* @var \DateTimeInterface
*
* @ORM\Column(name="created_at", type="datetime")
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'created_at', type: 'datetime')]
private $createdAt;
/**
* @var \DateTimeInterface
*
* @ORM\Column(name="updated_at", type="datetime")
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'updated_at', type: 'datetime')]
private $updatedAt;
/**
* @var \DateTimeInterface|null
*
* @ORM\Column(name="published_at", type="datetime", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'published_at', type: 'datetime', nullable: true)]
private $publishedAt;
/**
* @var array|null
*
* @ORM\Column(name="published_by", type="array", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'published_by', type: 'array', nullable: true)]
private $publishedBy;
/**
* @var \DateTimeInterface|null
*
* @ORM\Column(name="starred_at", type="datetime", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'starred_at', type: 'datetime', nullable: true)]
private $starredAt;
/**
* @ORM\OneToMany(targetEntity="Wallabag\Entity\Annotation", mappedBy="entry", cascade={"persist", "remove"})
* @ORM\JoinTable
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\JoinTable]
#[ORM\OneToMany(targetEntity: Annotation::class, mappedBy: 'entry', cascade: ['persist', 'remove'])]
private $annotations;
/**
* @var string|null
*
* @ORM\Column(name="mimetype", type="text", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'mimetype', type: 'text', nullable: true)]
private $mimetype;
/**
* @var string|null
*
* @ORM\Column(name="language", type="string", length=20, nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'language', type: 'string', length: 20, nullable: true)]
private $language;
/**
* @var int
*
* @ORM\Column(name="reading_time", type="integer", nullable=false)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'reading_time', type: 'integer', nullable: false)]
private $readingTime = 0;
/**
* @var string|null
*
* @ORM\Column(name="domain_name", type="text", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'domain_name', type: 'text', nullable: true)]
private $domainName;
/**
* @var string|null
*
* @ORM\Column(name="preview_picture", type="text", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'preview_picture', type: 'text', nullable: true)]
private $previewPicture;
/**
* @var string|null
*
* @ORM\Column(name="http_status", type="string", length=3, nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'http_status', type: 'string', length: 3, nullable: true)]
private $httpStatus;
/**
* @var array|null
*
* @ORM\Column(name="headers", type="array", nullable=true)
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'headers', type: 'array', nullable: true)]
private $headers;
/**
@ -281,33 +254,23 @@ class Entry
*
* @Exclude
*
* @ORM\Column(name="is_not_parsed", type="boolean", options={"default": false})
*
* @Groups({"entries_for_user", "export_all"})
*/
#[ORM\Column(name: 'is_not_parsed', type: 'boolean', options: ['default' => false])]
private $isNotParsed = false;
/**
* @Exclude
*
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\User", inversedBy="entries")
*
* @Groups({"export_all"})
*/
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'entries')]
private $user;
/**
* @ORM\ManyToMany(targetEntity="Wallabag\Entity\Tag", inversedBy="entries", cascade={"persist"})
* @ORM\JoinTable(
* name="entry_tag",
* joinColumns={
* @ORM\JoinColumn(name="entry_id", referencedColumnName="id", onDelete="cascade")
* },
* inverseJoinColumns={
* @ORM\JoinColumn(name="tag_id", referencedColumnName="id", onDelete="cascade")
* }
* )
*/
#[ORM\JoinTable(name: 'entry_tag')]
#[ORM\JoinColumn(name: 'entry_id', referencedColumnName: 'id', onDelete: 'cascade')]
#[ORM\InverseJoinColumn(name: 'tag_id', referencedColumnName: 'id', onDelete: 'cascade')]
#[ORM\ManyToMany(targetEntity: Tag::class, inversedBy: 'entries', cascade: ['persist'])]
private $tags;
/*

View file

@ -5,22 +5,21 @@ namespace Wallabag\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\RulerZ\Validator\Constraints as RulerZAssert;
use Symfony\Component\Validator\Constraints as Assert;
use Wallabag\Repository\IgnoreOriginInstanceRuleRepository;
/**
* Ignore Origin rule.
*
* @ORM\Entity(repositoryClass="Wallabag\Repository\IgnoreOriginInstanceRuleRepository")
* @ORM\Table(name="`ignore_origin_instance_rule`")
*/
#[ORM\Table(name: '`ignore_origin_instance_rule`')]
#[ORM\Entity(repositoryClass: IgnoreOriginInstanceRuleRepository::class)]
class IgnoreOriginInstanceRule implements IgnoreOriginRuleInterface, RuleInterface
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
@ -32,8 +31,8 @@ class IgnoreOriginInstanceRule implements IgnoreOriginRuleInterface, RuleInterfa
* allowed_variables={"host","_all"},
* allowed_operators={"=","~"}
* )
* @ORM\Column(name="rule", type="string", nullable=false)
*/
#[ORM\Column(name: 'rule', type: 'string', nullable: false)]
private $rule;
/**

View file

@ -5,22 +5,21 @@ namespace Wallabag\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\RulerZ\Validator\Constraints as RulerZAssert;
use Symfony\Component\Validator\Constraints as Assert;
use Wallabag\Repository\IgnoreOriginUserRuleRepository;
/**
* Ignore Origin rule.
*
* @ORM\Entity(repositoryClass="Wallabag\Repository\IgnoreOriginUserRuleRepository")
* @ORM\Table(name="`ignore_origin_user_rule`")
*/
#[ORM\Table(name: '`ignore_origin_user_rule`')]
#[ORM\Entity(repositoryClass: IgnoreOriginUserRuleRepository::class)]
class IgnoreOriginUserRule implements IgnoreOriginRuleInterface, RuleInterface
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
@ -32,14 +31,12 @@ class IgnoreOriginUserRule implements IgnoreOriginRuleInterface, RuleInterface
* allowed_variables={"host","_all"},
* allowed_operators={"=","~"}
* )
* @ORM\Column(name="rule", type="string", nullable=false)
*/
#[ORM\Column(name: 'rule', type: 'string', nullable: false)]
private $rule;
/**
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\Config", inversedBy="ignoreOriginRules")
* @ORM\JoinColumn(nullable=false)
*/
#[ORM\JoinColumn(nullable: false)]
#[ORM\ManyToOne(targetEntity: Config::class, inversedBy: 'ignoreOriginRules')]
private $config;
/**

View file

@ -3,22 +3,21 @@
namespace Wallabag\Entity;
use Craue\ConfigBundle\Entity\BaseSetting;
use Craue\ConfigBundle\Repository\SettingRepository;
use Doctrine\ORM\Mapping as ORM;
/**
* InternalSetting.
*
* Re-define setting so we can override length attribute to fix utf8mb4 issue.
*
* @ORM\Entity(repositoryClass="Craue\ConfigBundle\Repository\SettingRepository")
* @ORM\Table(name="`internal_setting`")
*/
#[ORM\Table(name: '`internal_setting`')]
#[ORM\Entity(repositoryClass: SettingRepository::class)]
class InternalSetting extends BaseSetting
{
/**
* @var string|null
*
* @ORM\Column(name="value", type="string", nullable=true)
*/
#[ORM\Column(name: 'value', type: 'string', nullable: true)]
protected $value;
}

View file

@ -5,25 +5,24 @@ namespace Wallabag\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Wallabag\Helper\EntityTimestampsTrait;
use Wallabag\Repository\SiteCredentialRepository;
/**
* SiteCredential.
*
* @ORM\Entity(repositoryClass="Wallabag\Repository\SiteCredentialRepository")
* @ORM\Table(name="`site_credential`")
* @ORM\HasLifecycleCallbacks()
*/
#[ORM\Table(name: '`site_credential`')]
#[ORM\Entity(repositoryClass: SiteCredentialRepository::class)]
#[ORM\HasLifecycleCallbacks]
class SiteCredential
{
use EntityTimestampsTrait;
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
@ -31,44 +30,40 @@ class SiteCredential
*
* @Assert\NotBlank()
* @Assert\Length(max=255)
* @ORM\Column(name="host", type="string", length=255)
*/
#[ORM\Column(name: 'host', type: 'string', length: 255)]
private $host;
/**
* @var string
*
* @Assert\NotBlank()
* @ORM\Column(name="username", type="text")
*/
#[ORM\Column(name: 'username', type: 'text')]
private $username;
/**
* @var string
*
* @Assert\NotBlank()
* @ORM\Column(name="password", type="text")
*/
#[ORM\Column(name: 'password', type: 'text')]
private $password;
/**
* @var \DateTime
*
* @ORM\Column(name="createdAt", type="datetime")
*/
#[ORM\Column(name: 'createdAt', type: 'datetime')]
private $createdAt;
/**
* @var \DateTime|null
*
* @ORM\Column(name="updated_at", type="datetime", nullable=true)
*/
#[ORM\Column(name: 'updated_at', type: 'datetime', nullable: true)]
private $updatedAt;
/**
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\User", inversedBy="siteCredentials")
* @ORM\JoinColumn(nullable=false)
*/
#[ORM\JoinColumn(nullable: false)]
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'siteCredentials')]
private $user;
/*

View file

@ -8,50 +8,45 @@ use Gedmo\Mapping\Annotation as Gedmo;
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Expose;
use JMS\Serializer\Annotation\XmlRoot;
use Wallabag\Repository\TagRepository;
/**
* Tag.
*
* @XmlRoot("tag")
* @ORM\Table(
* name="`tag`",
* indexes={
* @ORM\Index(columns={"label"}),
* }
* )
* @ORM\Entity(repositoryClass="Wallabag\Repository\TagRepository")
* @ExclusionPolicy("all")
*/
#[ORM\Table(name: '`tag`')]
#[ORM\Index(columns: ['label'])]
#[ORM\Entity(repositoryClass: TagRepository::class)]
class Tag
{
/**
* @var int
*
* @Expose
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
* @var string
*
* @Expose
* @ORM\Column(name="label", type="text")
*/
#[ORM\Column(name: 'label', type: 'text')]
private $label;
/**
* @Expose
* @Gedmo\Slug(fields={"label"}, prefix="t:")
* @ORM\Column(length=128, unique=true)
*/
#[ORM\Column(length: 128, unique: true)]
private $slug;
/**
* @ORM\ManyToMany(targetEntity="Entry", mappedBy="tags", cascade={"persist"})
*/
#[ORM\ManyToMany(targetEntity: Entry::class, mappedBy: 'tags', cascade: ['persist'])]
private $entries;
public function __construct()

View file

@ -8,24 +8,23 @@ use JMS\Serializer\Annotation\Groups;
use JMS\Serializer\Annotation\XmlRoot;
use Symfony\Bridge\RulerZ\Validator\Constraints as RulerZAssert;
use Symfony\Component\Validator\Constraints as Assert;
use Wallabag\Repository\TaggingRuleRepository;
/**
* Tagging rule.
*
* @XmlRoot("tagging_rule")
* @ORM\Entity(repositoryClass="Wallabag\Repository\TaggingRuleRepository")
* @ORM\Table(name="`tagging_rule`")
* @ORM\Entity
*/
#[ORM\Table(name: '`tagging_rule`')]
#[ORM\Entity(repositoryClass: TaggingRuleRepository::class)]
class TaggingRule implements RuleInterface
{
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
private $id;
/**
@ -37,27 +36,26 @@ class TaggingRule implements RuleInterface
* allowed_variables={"title", "url", "isArchived", "isStarred", "content", "language", "mimetype", "readingTime", "domainName"},
* allowed_operators={">", "<", ">=", "<=", "=", "is", "!=", "and", "not", "or", "matches", "notmatches"}
* )
* @ORM\Column(name="rule", type="string", nullable=false)
*
* @Groups({"export_tagging_rule"})
*/
#[ORM\Column(name: 'rule', type: 'string', nullable: false)]
private $rule;
/**
* @var array<string>
*
* @Assert\NotBlank()
* @ORM\Column(name="tags", type="simple_array", nullable=false)
*
* @Groups({"export_tagging_rule"})
*/
#[ORM\Column(name: 'tags', type: 'simple_array', nullable: false)]
private $tags = [];
/**
* @Exclude
*
* @ORM\ManyToOne(targetEntity="Wallabag\Entity\Config", inversedBy="taggingRules")
*/
#[ORM\ManyToOne(targetEntity: Config::class, inversedBy: 'taggingRules')]
private $config;
/**

View file

@ -16,18 +16,19 @@ use Scheb\TwoFactorBundle\Model\Google\TwoFactorInterface as GoogleTwoFactorInte
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Wallabag\Entity\Api\Client;
use Wallabag\Helper\EntityTimestampsTrait;
use Wallabag\Repository\UserRepository;
/**
* User.
*
* @XmlRoot("user")
* @ORM\Entity(repositoryClass="Wallabag\Repository\UserRepository")
* @ORM\Table(name="`user`")
* @ORM\HasLifecycleCallbacks()
*
* @UniqueEntity("email")
* @UniqueEntity("username")
*/
#[ORM\Table(name: '`user`')]
#[ORM\Entity(repositoryClass: UserRepository::class)]
#[ORM\HasLifecycleCallbacks]
class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorInterface, BackupCodeInterface
{
use EntityTimestampsTrait;
@ -36,10 +37,6 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI
/**
* @var int
*
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="AUTO")
*
* @OA\Property(
* description="The unique numeric id of the user",
* type="int",
@ -48,21 +45,22 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI
*
* @Groups({"user_api", "user_api_with_client"})
*/
#[ORM\Column(name: 'id', type: 'integer')]
#[ORM\Id]
#[ORM\GeneratedValue(strategy: 'AUTO')]
protected $id;
/**
* @var string|null
*
* @ORM\Column(name="name", type="text", nullable=true)
*
* @OA\Property(
* description="The personal Name of the user",
* type="string",
* example="Walla Baggger",
* )
*
* @Groups({"user_api", "user_api_with_client"})
*/
#[ORM\Column(name: 'name', type: 'text', nullable: true)]
protected $name;
/**
@ -94,55 +92,45 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI
/**
* @var \DateTime
*
* @ORM\Column(name="created_at", type="datetime")
*
* @OA\Property(
* description="Creation date of the user account. (In ISO 8601 format)",
* type="string",
* example="2023-06-27T19:25:44+0000",
* )
*
* @Groups({"user_api", "user_api_with_client"})
*/
#[ORM\Column(name: 'created_at', type: 'datetime')]
protected $createdAt;
/**
* @var \DateTime
*
* @ORM\Column(name="updated_at", type="datetime")
*
* @OA\Property(
* description="Update date of the user account. (In ISO 8601 format)",
* type="string",
* example="2023-06-27T19:37:30+0000",
* )
*
* @Groups({"user_api", "user_api_with_client"})
*/
#[ORM\Column(name: 'updated_at', type: 'datetime')]
protected $updatedAt;
/**
* @ORM\OneToMany(targetEntity="Wallabag\Entity\Entry", mappedBy="user", cascade={"remove"})
*/
#[ORM\OneToMany(targetEntity: Entry::class, mappedBy: 'user', cascade: ['remove'])]
protected $entries;
/**
* @ORM\OneToOne(targetEntity="Wallabag\Entity\Config", mappedBy="user", cascade={"remove"})
*/
#[ORM\OneToOne(targetEntity: Config::class, mappedBy: 'user', cascade: ['remove'])]
protected $config;
/**
* @var ArrayCollection&iterable<SiteCredential>
*
* @ORM\OneToMany(targetEntity="Wallabag\Entity\SiteCredential", mappedBy="user", cascade={"remove"})
*/
#[ORM\OneToMany(targetEntity: SiteCredential::class, mappedBy: 'user', cascade: ['remove'])]
protected $siteCredentials;
/**
* @var ArrayCollection&iterable<Client>
*
* @ORM\OneToMany(targetEntity="Wallabag\Entity\Api\Client", mappedBy="user", cascade={"remove"})
*/
#[ORM\OneToMany(targetEntity: Client::class, mappedBy: 'user', cascade: ['remove'])]
protected $clients;
/**
@ -158,28 +146,22 @@ class User extends BaseUser implements EmailTwoFactorInterface, GoogleTwoFactorI
*/
protected $default_client;
/**
* @ORM\Column(type="integer", nullable=true)
*/
#[ORM\Column(type: 'integer', nullable: true)]
private $authCode;
/**
* @ORM\Column(name="googleAuthenticatorSecret", type="string", nullable=true)
*/
#[ORM\Column(name: 'googleAuthenticatorSecret', type: 'string', nullable: true)]
private $googleAuthenticatorSecret;
/**
* @var array
*
* @ORM\Column(type="json", nullable=true)
*/
#[ORM\Column(type: 'json', nullable: true)]
private $backupCodes;
/**
* @var bool
*
* @ORM\Column(type="boolean")
*/
#[ORM\Column(type: 'boolean')]
private $emailTwoFactor = false;
public function __construct()

View file

@ -9,10 +9,8 @@ use Doctrine\ORM\Mapping as ORM;
*/
trait EntityTimestampsTrait
{
/**
* @ORM\PrePersist
* @ORM\PreUpdate
*/
#[ORM\PrePersist]
#[ORM\PreUpdate]
public function timestamps()
{
if (null === $this->createdAt) {