> For the complete documentation index, see [llms.txt](https://docs.chamilo.org/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.chamilo.org/3.x/el/odigos-programmatisti/developer-guide/backend/resource-system.md).

# Σύστημα πόρων

Το σύστημα πόρων είναι μία από τις σημαντικότερες αρχιτεκτονικές έννοιες στο Chamilo 3.0. Παρέχει μια ενιαία αφαίρεση για όλο το περιεχόμενο μαθημάτων — έγγραφα, ασκήσεις, διαδρομές μάθησης, αναρτήσεις φόρουμ και άλλα.

## Κεντρική Έννοια

Κάθε στοιχείο περιεχομένου μαθήματος αναπαρίσταται από έναν **ResourceNode**. Αυτό δίνει σε όλους τους τύπους περιεχομένου ένα κοινό σύνολο δυνατοτήτων:

* **Έλεγχος ορατότητας** — Εμφάνιση/απόκρυψη από τους εκπαιδευόμενους
* **Έλεγχος πρόσβασης** — Οι security voters ελέγχουν τα δικαιώματα μέσω του ResourceNode
* **Αποθήκευση αρχείων** — Τα συνημμένα αρχεία αποθηκεύονται μέσω ResourceFile
* **Δομή δέντρου** — Οι ResourceNodes σχηματίζουν δέντρο (σχέσεις γονέα-παιδιού)
* **Ίχνος ελέγχου** — Δημιουργός, ημερομηνία δημιουργίας, παρακολούθηση τροποποιήσεων

## Βασικές Οντότητες

### ResourceNode (`src/CoreBundle/Entity/ResourceNode.php`)

Η κεντρική οντότητα. Κάθε οντότητα περιεχομένου έχει σχέση ένα-προς-ένα με έναν ResourceNode.

Βασικά πεδία:

| Πεδίο           | Τύπος        | Περιγραφή                                |
| --------------- | ------------ | ---------------------------------------- |
| `id`            | integer      | Πρωτεύον κλειδί                          |
| `uuid`          | UUID v4      | Μοναδικό αναγνωριστικό για χρήση στο API |
| `title`         | string       | Τίτλος εμφάνισης                         |
| `creator`       | User         | Ο χρήστης που δημιούργησε αυτόν τον πόρο |
| `resourceFile`  | ResourceFile | Το συνημμένο αρχείο (αν υπάρχει)         |
| `resourceType`  | ResourceType | Ο τύπος πόρου (έγγραφο, κουίζ κ.λπ.)     |
| `parent`        | ResourceNode | Γονέας στο δέντρο πόρων                  |
| `children`      | Collection   | Παιδικοί ResourceNodes                   |
| `resourceLinks` | Collection   | Σύνδεσμοι ορατότητας και πρόσβασης       |

Το δέντρο χρησιμοποιεί τη στρατηγική **materialized path** του Gedmo για αποδοτικά ιεραρχικά ερωτήματα.

### ResourceFile (`src/CoreBundle/Entity/ResourceFile.php`)

Αποθηκεύει τα πραγματικά δεδομένα αρχείου ενός πόρου:

| Πεδίο          | Τύπος   | Περιγραφή                        |
| -------------- | ------- | -------------------------------- |
| `id`           | integer | Πρωτεύον κλειδί                  |
| `title`        | string  | Αρχικό όνομα αρχείου             |
| `mimeType`     | string  | Τύπος MIME                       |
| `originalName` | string  | Αρχικό όνομα μεταφόρτωσης        |
| `size`         | integer | Μέγεθος αρχείου σε bytes         |
| `crop`         | string  | Δεδομένα περικοπής (για εικόνες) |

Η αποθήκευση αρχείων γίνεται μέσω Flysystem, ώστε τα αρχεία να μπορούν να βρίσκονται σε τοπικό δίσκο, S3, Azure ή GCS ανάλογα με τη διαμόρφωση.

### ResourceLink

Ελέγχει την ορατότητα και την πρόσβαση ανά πλαίσιο. Υπάρχουν 3 κύριοι τύποι πλαισίου:

1. Course
2. Session
3. Group (σε ένα μάθημα)

Έτσι η οντότητα ResourceLink αντικατοπτρίζει τον συνδυασμό αυτών των 3 τύπων πλαισίου και καθορίζει την ορατότητα για αυτό το πλήρες πλαίσιο:

| Πεδίο        | Τύπος   | Περιγραφή                                 |
| ------------ | ------- | ----------------------------------------- |
| `course`     | Course  | Σε ποιο μάθημα ανήκει ο πόρος             |
| `session`    | Session | Ποια συνεδρία (null για το βασικό μάθημα) |
| `group`      | CGroup  | Ποια ομάδα (null για ολόκληρο το μάθημα)  |
| `visibility` | integer | Ορατό, αόρατο ή διαγραμμένο               |

Αυτό επιτρέπει στον ίδιο ResourceNode να έχει διαφορετική ορατότητα σε διαφορετικά πλαίσια (π.χ. ορατός σε μία συνεδρία αλλά κρυφός σε άλλη).

Αυτό ορίζεται αυτόματα όταν χρησιμοποιείται η διεπαφή και αποφασίζεται, για παράδειγμα, ότι ένας πόρος είναι ειδικός για συνεδρία και θα είναι ορατός για όλες τις ομάδες σε ένα δεδομένο μάθημα σε μια δεδομένη συνεδρία, αλλά αόρατος στο βασικό μάθημα ή σε άλλη συνεδρία.

Από προεπιλογή, οι πόροι που είναι ορατοί σε ένα βασικό μάθημα είναι επίσης ορατοί σε όλες τις συνεδρίες αυτού του μαθήματος, αλλά ο διδάσκων του μαθήματος μπορεί να αποφασίσει να αποκρύψει έναν πόρο από μια συγκεκριμένη συνεδρία. Σε αυτή την περίπτωση, ανακτούμε την ειδική ορατότητα για αυτόν τον πόρο σε αυτή τη συνεδρία και βλέπουμε ότι έχει ορατότητα 0, οπότε το στοιχείο δεν εμφανίζεται στους εκπαιδευόμενους σε αυτή τη συνεδρία, ενώ η έλλειψη ειδικής ορατότητας συνεδρίας σε άλλες συνεδρίες κάνει τον πόρο να χρησιμοποιεί την ορατότητα του βασικού μαθήματος (και ο πόρος εμφανίζεται στους εκπαιδευόμενους).

## Ενσωμάτωση API Platform

Ο ResourceNode εκτίθεται ως πόρος API Platform με ασφάλεια:

```php
#[ApiResource(
    operations: [
        new Get(security: "is_granted('VIEW', object)"),
        new Put(security: "is_granted('EDIT', object)"),
        new Delete(security: "is_granted('DELETE', object)"),
        new GetCollection(security: "is_granted('ROLE_USER')"),
    ]
)]
```

## Πώς Συνδέονται οι Οντότητες Περιεχομένου

Οι οντότητες περιεχομένου μαθήματος (CDocument, CQuiz, CLp κ.λπ.) επεκτείνουν την `AbstractResource` ή υλοποιούν την `ResourceInterface`, που τους δίνει σχέση `resourceNode`:

```php
// In CDocument entity:
#[ORM\OneToOne(targetEntity: ResourceNode::class)]
private ResourceNode $resourceNode;
```

Όταν δημιουργείτε ένα CDocument, δημιουργείται αυτόματα και ένας ResourceNode μαζί του, παρέχοντας ενιαία διαχείριση πόρων.

## Πρακτικές Επιπτώσεις

Όταν εργάζεστε με περιεχόμενο μαθήματος:

1. **Δημιουργία περιεχομένου** — Δημιουργήστε τόσο την οντότητα περιεχομένου ΟΣΟ και τον ResourceNode της
2. **Έλεγχος δικαιωμάτων** — Χρησιμοποιήστε τους security voters του ResourceNode
3. **Διαχείριση αρχείων** — Επισυνάψτε αρχεία μέσω ResourceFile
4. **Έλεγχος ορατότητας** — Δημιουργήστε/τροποποιήστε ResourceLinks
5. **Δόμηση δέντρων** — Χρησιμοποιήστε τη σχέση γονέα-παιδιού στον ResourceNode για δομές φακέλων (π.χ. φάκελοι εγγράφων)
