diff --git a/backend/database/repositories/filesystem.go b/backend/database/repositories/filesystem.go index 2845710d6..24afc9db7 100644 --- a/backend/database/repositories/filesystem.go +++ b/backend/database/repositories/filesystem.go @@ -25,7 +25,7 @@ func (rep filesystemRepository) query(query string, input ...interface{}) (Files err := rep.ctx.Query(query, input, &entity.EntityID, &entity.LogicalName, &entity.IsDocument, &entity.IsPublished, - &entity.CreatedAt, &entity.OwnerUserId, &entity.ParentFileID) + &entity.CreatedAt, &entity.MetadataID, &entity.OwnerUserId, &entity.ParentFileID) if err != nil { return FilesystemEntry{}, err } @@ -98,6 +98,26 @@ func (rep filesystemRepository) GetIDWithPath(path string) (uuid.UUID, error) { return parent.EntityID, err } +func (rep filesystemRepository) GetMetadataFromID(ID uuid.UUID) (MetadataEntry, error) { + // Get entry from ID + entry, err := rep.GetEntryWithID(ID) + if err != nil { + return MetadataEntry{}, err + } + + // Get metadata + entity := MetadataEntry{} + + err = rep.ctx.Query("SELECT * FROM metadata WHERE MetadataID = $1", + []interface{}{entry.MetadataID}, + &entity.MetadataID, &entity.CreatedAt) + if err != nil { + return MetadataEntry{}, err + } + return entity, nil + +} + func (rep filesystemRepository) DeleteEntryWithID(ID uuid.UUID) error { return rep.ctx.Exec("SELECT delete_entity($1)", []interface{}{ID}) } diff --git a/backend/database/repositories/mocks/repositories_mock.go b/backend/database/repositories/mocks/repositories_mock.go index 7bf71b785..4ffd64b6e 100644 --- a/backend/database/repositories/mocks/repositories_mock.go +++ b/backend/database/repositories/mocks/repositories_mock.go @@ -125,6 +125,21 @@ func (mr *MockFilesystemRepositoryMockRecorder) GetIDWithPath(path interface{}) return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetIDWithPath", reflect.TypeOf((*MockFilesystemRepository)(nil).GetIDWithPath), path) } +// GetMetadataFromID mocks base method. +func (m *MockFilesystemRepository) GetMetadataFromID(ID uuid.UUID) (repositories.MetadataEntry, error) { + m.ctrl.T.Helper() + ret := m.ctrl.Call(m, "GetMetadataFromID", ID) + ret0, _ := ret[0].(repositories.MetadataEntry) + ret1, _ := ret[1].(error) + return ret0, ret1 +} + +// GetMetadataFromID indicates an expected call of GetMetadataFromID. +func (mr *MockFilesystemRepositoryMockRecorder) GetMetadataFromID(ID interface{}) *gomock.Call { + mr.mock.ctrl.T.Helper() + return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetMetadataFromID", reflect.TypeOf((*MockFilesystemRepository)(nil).GetMetadataFromID), ID) +} + // GetRoot mocks base method. func (m *MockFilesystemRepository) GetRoot() (repositories.FilesystemEntry, error) { m.ctrl.T.Helper() diff --git a/backend/database/repositories/repository_interfaces.go b/backend/database/repositories/repository_interfaces.go index 114cd0e80..a15826c8b 100644 --- a/backend/database/repositories/repository_interfaces.go +++ b/backend/database/repositories/repository_interfaces.go @@ -19,11 +19,18 @@ type FilesystemEntry struct { IsPublished bool CreatedAt time.Time + MetadataID uuid.UUID + OwnerUserId int ParentFileID uuid.UUID ChildrenIDs []uuid.UUID } +type MetadataEntry struct { + MetadataID uuid.UUID + CreatedAt time.Time +} + type ( // Repository interface that all valid filesystem repositories // mocked/real should implement @@ -32,6 +39,7 @@ type ( GetRoot() (FilesystemEntry, error) GetEntryWithParentID(ID uuid.UUID) (FilesystemEntry, error) GetIDWithPath(path string) (uuid.UUID, error) + GetMetadataFromID(ID uuid.UUID) (MetadataEntry, error) CreateEntry(file FilesystemEntry) (FilesystemEntry, error) DeleteEntryWithID(ID uuid.UUID) error diff --git a/backend/database/repositories/tests/filesystem_test.go b/backend/database/repositories/tests/filesystem_test.go index e9bbdb5c1..a588f0ecb 100644 --- a/backend/database/repositories/tests/filesystem_test.go +++ b/backend/database/repositories/tests/filesystem_test.go @@ -283,6 +283,31 @@ func TestGetIDWithPath(t *testing.T) { }) } +func TestMetadataRetrieval(t *testing.T) { + assert := assert.New(t) + + testContext.RunTest(func() { + // ==== Setup ==== + repo, err := repositories.NewFilesystemRepo(frontendLogicalName, frontendURL, testContext) + assert.Nil(err) + root, _ := repo.GetRoot() + newDoc, err := repo.CreateEntry(repositories.FilesystemEntry{ + LogicalName: "test_doc", ParentFileID: root.EntityID, + OwnerUserId: repositories.GROUPS_ADMIN, IsDocument: true, + }) + // ==== Assertions ==== + if err != nil { + log.Fatalf(err.Error()) + } + + // Query for metadata in database + if info, err := repo.GetMetadataFromID(newDoc.EntityID); assert.Nil(err) { + assert.Equal(newDoc.MetadataID, info.MetadataID) + assert.NotEmpty(info.CreatedAt) + } + }) +} + func TestMultiApplications(t *testing.T) { assert := assert.New(t) diff --git a/postgres/up/04-create_filesystem_table.sql b/postgres/up/04-create_filesystem_table.sql index ba02f3571..d502f7d0f 100644 --- a/postgres/up/04-create_filesystem_table.sql +++ b/postgres/up/04-create_filesystem_table.sql @@ -21,7 +21,7 @@ CREATE TABLE filesystem ( CreatedAt TIMESTAMP NOT NULL DEFAULT NOW(), /* MetaData */ - -- MetadataID uuid NOT NULL, + MetadataID uuid NOT NULL, OwnedBy INT, @@ -32,7 +32,7 @@ CREATE TABLE filesystem ( CONSTRAINT fk_owner FOREIGN KEY (OwnedBy) REFERENCES groups(GroupID), - -- CONSTRAINT fk_meta FOREIGN KEY (MetadataID) REFERENCES metadata(MetadataID), + CONSTRAINT fk_meta FOREIGN KEY (MetadataID) REFERENCES metadata(MetadataID), /* Unique name constraint: there should not exist an entity of the same type with the same parent and logical name. */ @@ -48,14 +48,16 @@ AS $$ DECLARE newEntityID filesystem.EntityID%type; parentIsDocument BOOLEAN := (SELECT IsDocument FROM filesystem WHERE EntityID = parentP LIMIT 1); + newMetadataID filesystem.MetadataID%type; BEGIN IF parentIsDocument THEN /* We shouldn't be declaring that a document is our parent */ RAISE EXCEPTION SQLSTATE '90001' USING MESSAGE = 'cannot make parent a document'; END If; + INSERT INTO metadata DEFAULT VALUES RETURNING MetadataID INTO newMetadataID; WITH newEntity AS ( - INSERT INTO filesystem (LogicalName, IsDocument, OwnedBy, Parent) - VALUES (logicalNameP, isDocumentP, ownedByP, parentP) + INSERT INTO filesystem (LogicalName, IsDocument, MetadataID, OwnedBy, Parent) + VALUES (logicalNameP, isDocumentP, newMetadataID, ownedByP, parentP) RETURNING EntityID ) diff --git a/postgres/up/05-create_frontend_table.sql b/postgres/up/05-create_frontend_table.sql index 2e0ae39d5..bf8f052d0 100644 --- a/postgres/up/05-create_frontend_table.sql +++ b/postgres/up/05-create_frontend_table.sql @@ -22,10 +22,12 @@ AS $$ DECLARE frontendIDP frontend.ID%type; frontendRoot frontend.Root%type; + newMetadataID filesystem.MetadataID%type; BEGIN -- TODO: Temporarily setting the OwnedBy field. Going to be deprecated soon. - INSERT INTO filesystem (LogicalName, IsDocument, Parent, OwnedBy) - VALUES (logicalNameP, false, uuid_nil(), 1) + INSERT INTO metadata DEFAULT VALUES RETURNING MetadataID INTO newMetadataID; + INSERT INTO filesystem (LogicalName, IsDocument, Parent, OwnedBy, MetadataID) + VALUES (logicalNameP, false, uuid_nil(), 1, newMetadataID) RETURNING entityID INTO frontendRoot; INSERT INTO frontend