From 9d18356999bade969a8d176a9ddaabd4f9e07557 Mon Sep 17 00:00:00 2001 From: jensp Date: Tue, 21 Feb 2017 14:20:32 +0000 Subject: [PATCH] CCM NG/ccm-cms: Additional fields for content item to provide easier access to auditing data. git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4586 8810af33-2d31-482b-a856-94f89814c4df Former-commit-id: 251c2efb7ae6b5048fd5df4ca39b80ae54f950c7 --- .../ui/folder/FolderBrowserController.java | 131 +++++---- .../librecms/contentsection/ContentItem.java | 275 ++++++++++++------ .../contentsection/ContentItemRepository.java | 28 ++ .../h2/V7_0_0_10__add_item_auditing_data.sql | 12 + .../V7_0_0_10__add_item_auditing_data.sql | 12 + .../scripts/create_ccm_cms_schema.sql | 4 + .../scripts/create_ccm_cms_schema.sql | 4 + .../datasets/create_ccm_cms_schema.sql | 4 + 8 files changed, 312 insertions(+), 158 deletions(-) create mode 100644 ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_10__add_item_auditing_data.sql create mode 100644 ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_10__add_item_auditing_data.sql diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java index 88617ed3e..79ebb687f 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/folder/FolderBrowserController.java @@ -50,15 +50,12 @@ import javax.annotation.PostConstruct; import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.persistence.EntityManager; -import javax.persistence.TypedQuery; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; -import javax.persistence.criteria.Expression; import javax.persistence.criteria.Join; -import javax.persistence.criteria.Order; -import javax.persistence.criteria.Predicate; import javax.persistence.criteria.Root; import javax.transaction.Transactional; +import org.hibernate.envers.AuditReader; /** * @@ -68,11 +65,14 @@ import javax.transaction.Transactional; public class FolderBrowserController { private static final Logger LOGGER = LogManager.getLogger( - FolderBrowserController.class); + FolderBrowserController.class); @Inject private EntityManager entityManager; + @Inject + private AuditReader auditReader; + @Inject private CcmObjectRepository objectRepo; @@ -93,7 +93,7 @@ public class FolderBrowserController { @PostConstruct private void init() { final KernelConfig kernelConfig = confManager.findConfiguration( - KernelConfig.class); + KernelConfig.class); defaultLocale = kernelConfig.getDefaultLocale(); } @@ -126,19 +126,19 @@ public class FolderBrowserController { final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); final CriteriaQuery criteriaQuery = builder - .createQuery(CcmObject.class); + .createQuery(CcmObject.class); final Root from = criteriaQuery.from(CcmObject.class); - + return entityManager.createQuery( - criteriaQuery - .select(from) - .where(builder.or( - from.in(findSubFolders(folder, filterTerm)), - from.in(findItemsInFolder(folder, filterTerm)))) - .orderBy(builder.asc(from.get("displayName")))) - .setFirstResult(first) - .setMaxResults(maxResults) - .getResultList(); + criteriaQuery + .select(from) + .where(builder.or( + from.in(findSubFolders(folder, filterTerm)), + from.in(findItemsInFolder(folder, filterTerm)))) + .orderBy(builder.asc(from.get("displayName")))) + .setFirstResult(first) + .setMaxResults(maxResults) + .getResultList(); } public long countObjects(final Folder folder) { @@ -150,17 +150,19 @@ public class FolderBrowserController { final CriteriaBuilder builder = entityManager.getCriteriaBuilder(); final CriteriaQuery criteriaQuery = builder.createQuery( - Long.class); + Long.class); final Root from = criteriaQuery.from(CcmObject.class); return entityManager - .createQuery( - criteriaQuery - .select(builder.count(from)) - .where(builder.or( - from.in(findSubFolders(folder, filterTerm)), - from.in(findItemsInFolder(folder, filterTerm))))) - .getSingleResult(); + .createQuery( + criteriaQuery + .select(builder.count(from)) + .where(builder.or( + from.in(findSubFolders(folder, + filterTerm)), + from.in(findItemsInFolder(folder, + filterTerm))))). + getSingleResult(); } @Transactional(Transactional.TxType.REQUIRED) @@ -169,8 +171,8 @@ public class FolderBrowserController { final List objects = findObjects(folder, orderBy); return objects.stream() - .map(object -> buildRow(object)) - .collect(Collectors.toList()); + .map(object -> buildRow(object)) + .collect(Collectors.toList()); } @Transactional(Transactional.TxType.REQUIRED) @@ -182,8 +184,8 @@ public class FolderBrowserController { orderBy); return objects.stream() - .map(object -> buildRow(object)) - .collect(Collectors.toList()); + .map(object -> buildRow(object)) + .collect(Collectors.toList()); } @Transactional(Transactional.TxType.REQUIRED) @@ -191,14 +193,14 @@ public class FolderBrowserController { final String orderBy, final int first, final int maxResults) { - final List objects = findObjects(folder, - orderBy, - first, + final List objects = findObjects(folder, + orderBy, + first, maxResults); return objects.stream() - .map(object -> buildRow(object)) - .collect(Collectors.toList()); + .map(object -> buildRow(object)) + .collect(Collectors.toList()); } @Transactional(Transactional.TxType.REQUIRED) @@ -214,8 +216,8 @@ public class FolderBrowserController { maxResults); return objects.stream() - .map(object -> buildRow(object)) - .collect(Collectors.toList()); + .map(object -> buildRow(object)) + .collect(Collectors.toList()); } private FolderBrowserTableRow buildRow(final CcmObject object) { @@ -228,9 +230,9 @@ public class FolderBrowserController { row.setName(folder.getName()); row.setLanguages(Collections.emptyList()); if (folder.getTitle().hasValue(globalizationHelper - .getNegotiatedLocale())) { + .getNegotiatedLocale())) { row.setTitle(folder.getTitle().getValue(globalizationHelper - .getNegotiatedLocale())); + .getNegotiatedLocale())); } else { row.setTitle(folder.getTitle().getValue(defaultLocale)); } @@ -241,20 +243,20 @@ public class FolderBrowserController { row.setObjectUuid(item.getItemUuid()); row.setName(item.getName().getValue(defaultLocale)); final List languages = new ArrayList<>(itemL10NManager - .availableLanguages(item)); + .availableLanguages(item)); languages.sort((lang1, lang2) -> lang1.toString().compareTo( - lang2.toString())); + lang2.toString())); row.setLanguages(languages); if (item.getTitle().hasValue(globalizationHelper - .getNegotiatedLocale())) { + .getNegotiatedLocale())) { row.setTitle(item.getTitle().getValue(globalizationHelper - .getNegotiatedLocale())); + .getNegotiatedLocale())); } else { row.setTitle(item.getTitle().getValue(defaultLocale)); } final ContentType type = item.getContentType(); final ContentTypeInfo typeInfo = typesManager.getContentTypeInfo( - type); + type); row.setTypeLabelBundle(typeInfo.getLabelBundle()); row.setTypeLabelKey(typeInfo.getLabelKey()); row.setFolder(false); @@ -291,44 +293,45 @@ public class FolderBrowserController { private List findSubFolders(final Folder folder, final String filterTerm) { final CriteriaBuilder builder = entityManager - .getCriteriaBuilder(); + .getCriteriaBuilder(); final CriteriaQuery query = builder.createQuery( - Folder.class); + Folder.class); final Root from = query.from(Folder.class); return entityManager.createQuery( - query.where(builder.and( - builder.equal(from.get("parentCategory"), folder), - builder.like(builder.lower(from.get("name")), filterTerm)))) - .getResultList(); + query.where(builder.and( + builder.equal(from.get("parentCategory"), folder), + builder. + like(builder.lower(from.get("name")), filterTerm)))). + getResultList(); } private List findItemsInFolder( - final Folder folder, - final String filterTerm) { + final Folder folder, + final String filterTerm) { final CriteriaBuilder builder = entityManager - .getCriteriaBuilder(); + .getCriteriaBuilder(); final CriteriaQuery query = builder.createQuery( - ContentItem.class); + ContentItem.class); final Root fromItem = query.from(ContentItem.class); final Join join = fromItem.join( - "categories"); + "categories"); return entityManager.createQuery(query - .select(fromItem) - .where(builder.and( - builder.equal(join.get("category"), folder), - builder.equal(join.get("type"), - CmsConstants.CATEGORIZATION_TYPE_FOLDER), - builder.equal(fromItem.get("version"), - ContentItemVersion.DRAFT), - builder.like(fromItem.get("displayName"), - filterTerm)))) - .getResultList(); + .select(fromItem) + .where(builder.and( + builder.equal(join.get("category"), folder), + builder.equal(join.get("type"), + CmsConstants.CATEGORIZATION_TYPE_FOLDER), + builder.equal(fromItem.get("version"), + ContentItemVersion.DRAFT), + builder.like(fromItem.get("displayName"), + filterTerm)))) + .getResultList(); } } diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java index ef34e1ece..4c73fe6f1 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItem.java @@ -56,6 +56,7 @@ import javax.persistence.TemporalType; import org.hibernate.search.annotations.IndexedEmbedded; import javax.persistence.FetchType; +import org.hibernate.envers.NotAudited; import static org.librecms.CmsConstants.*; @@ -70,93 +71,95 @@ import static org.librecms.CmsConstants.*; //@Indexed @NamedQueries({ @NamedQuery( - name = "ContentItem.findById", - query = "SELECT i FROM ContentItem i " - + "WHERE i.objectId = :objectId " - + "AND (EXISTS(SELECT p FROM Permission p " - + "WHERE p.grantedPrivilege = 'read' " - + "AND p.grantee IN :roles " - + "AND p.object = i)" - + "OR true = :admin)") + name = "ContentItem.findById", + query = "SELECT i FROM ContentItem i " + + "WHERE i.objectId = :objectId " + + "AND (EXISTS(SELECT p FROM Permission p " + + "WHERE p.grantedPrivilege = 'read' " + + "AND p.grantee IN :roles " + + "AND p.object = i)" + + "OR true = :admin)") , @NamedQuery( - name = "ContentItem.findByType", - query = "SELECT i FROM ContentItem i WHERE TYPE(i) = :type") + name = "ContentItem.findByType", + query = "SELECT i FROM ContentItem i WHERE TYPE(i) = :type") , @NamedQuery( - name = "ContentItem.findByFolder", - query = "SELECT i FROM ContentItem i " - + "JOIN i.categories c " - + "WHERE c.category = :folder " - + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER - + "'") + name = "ContentItem.findByFolder", + query = "SELECT i FROM ContentItem i " + + "JOIN i.categories c " + + "WHERE c.category = :folder " + + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + + "'") , @NamedQuery( - name = "ContentItem.countItemsInFolder", - query = "SELECT count(i) FROM ContentItem i " - + "JOIN i.categories c " - + "WHERE c.category = :folder " - + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER - + "'") + name = "ContentItem.countItemsInFolder", + query = "SELECT count(i) FROM ContentItem i " + + "JOIN i.categories c " + + "WHERE c.category = :folder " + + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + + "'") , @NamedQuery( - name = "ContentItem.findByNameInFolder", - query = "SELECT i FROM ContentItem i " - + "JOIN i.categories c " - + "WHERE c.category = :folder " - + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' " - + "AND i.displayName = :name") + name = "ContentItem.findByNameInFolder", + query = "SELECT i FROM ContentItem i " + + "JOIN i.categories c " + + "WHERE c.category = :folder " + + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + + "' " + + "AND i.displayName = :name") , @NamedQuery( - name = "ContentItem.countByNameInFolder", - query = "SELECT COUNT(i) FROM ContentItem i " - + "JOIN i.categories c " - + "WHERE c.category = :folder " - + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + "' " - + "AND i.displayName = :name") + name = "ContentItem.countByNameInFolder", + query = "SELECT COUNT(i) FROM ContentItem i " + + "JOIN i.categories c " + + "WHERE c.category = :folder " + + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + + "' " + + "AND i.displayName = :name") , @NamedQuery( - name = "ContentItem.filterByFolderAndName", - query = "SELECT i FROM ContentItem i " - + "JOIN i.categories c " - + "WHERE c.category = :folder " - + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER - + "' " - + "AND LOWER(i.displayName) LIKE CONCAT(LOWER(:name), '%')") + name = "ContentItem.filterByFolderAndName", + query = "SELECT i FROM ContentItem i " + + "JOIN i.categories c " + + "WHERE c.category = :folder " + + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + + "' " + + "AND LOWER(i.displayName) LIKE CONCAT(LOWER(:name), '%')") , @NamedQuery( - name = "ContentItem.countFilterByFolderAndName", - query = "SELECT COUNT(i) FROM ContentItem i " - + "JOIN i.categories c " - + "WHERE c.category = :folder " - + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER - + "' " - + "AND LOWER(i.displayName) LIKE CONCAT(LOWER(:name), '%')" + name = "ContentItem.countFilterByFolderAndName", + query = "SELECT COUNT(i) FROM ContentItem i " + + "JOIN i.categories c " + + "WHERE c.category = :folder " + + "AND c.type = '" + CATEGORIZATION_TYPE_FOLDER + + "' " + + "AND LOWER(i.displayName) LIKE CONCAT(LOWER(:name), '%')" ) , @NamedQuery( - name = "ContentItem.hasLiveVersion", - query = "SELECT (CASE WHEN COUNT(i) > 0 THEN true ELSE false END) " - + "FROM ContentItem i " - + "WHERE i.itemUuid = :uuid " - + "AND i.version = org.librecms.contentsection.ContentItemVersion.LIVE") + name = "ContentItem.hasLiveVersion", + query = "SELECT (CASE WHEN COUNT(i) > 0 THEN true ELSE false END) " + + "FROM ContentItem i " + + "WHERE i.itemUuid = :uuid " + + "AND i.version = org.librecms.contentsection.ContentItemVersion.LIVE") , @NamedQuery( - name = "ContentItem.findDraftVersion", - query = "SELECT i FROM ContentItem i " - + "WHERE i.itemUuid = :uuid " - + "AND i.version = org.librecms.contentsection.ContentItemVersion.DRAFT") + name = "ContentItem.findDraftVersion", + query = "SELECT i FROM ContentItem i " + + "WHERE i.itemUuid = :uuid " + + "AND i.version = org.librecms.contentsection.ContentItemVersion.DRAFT") , @NamedQuery( - name = "ContentItem.findLiveVersion", - query = "SELECT i FROM ContentItem i " - + "WHERE i.itemUuid = :uuid " - + "AND i.version = org.librecms.contentsection.ContentItemVersion.LIVE") + name = "ContentItem.findLiveVersion", + query = "SELECT i FROM ContentItem i " + + "WHERE i.itemUuid = :uuid " + + "AND i.version = org.librecms.contentsection.ContentItemVersion.LIVE") , @NamedQuery( - name = "ContentItem.findItemWithWorkflow", - query = "SELECT i FROM ContentItem i " - + "WHERE i.workflow = :workflow" + name = "ContentItem.findItemWithWorkflow", + query = "SELECT i FROM ContentItem i " + + "WHERE i.workflow = :workflow" ) }) public class ContentItem extends CcmObject implements Serializable { @@ -175,13 +178,13 @@ public class ContentItem extends CcmObject implements Serializable { */ @Embedded @AssociationOverride( - name = "values", - joinTable = @JoinTable(name = "CONTENT_ITEM_NAMES", - schema = DB_SCHEMA, - joinColumns = { - @JoinColumn(name = "OBJECT_ID") - } - ) + name = "values", + joinTable = @JoinTable(name = "CONTENT_ITEM_NAMES", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "OBJECT_ID") + } + ) ) // @Field private LocalizedString name; @@ -200,13 +203,13 @@ public class ContentItem extends CcmObject implements Serializable { */ @Embedded @AssociationOverride( - name = "values", - joinTable = @JoinTable(name = "CONTENT_ITEM_TITLES", - schema = DB_SCHEMA, - joinColumns = { - @JoinColumn(name = "OBJECT_ID") - } - ) + name = "values", + joinTable = @JoinTable(name = "CONTENT_ITEM_TITLES", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "OBJECT_ID") + } + ) ) @IndexedEmbedded private LocalizedString title; @@ -216,12 +219,12 @@ public class ContentItem extends CcmObject implements Serializable { */ @Embedded @AssociationOverride( - name = "values", - joinTable = @JoinTable(name = "CONTENT_ITEM_DESCRIPTIONS", - schema = DB_SCHEMA, - joinColumns = { - @JoinColumn(name = "OBJECT_ID")} - )) + name = "values", + joinTable = @JoinTable(name = "CONTENT_ITEM_DESCRIPTIONS", + schema = DB_SCHEMA, + joinColumns = { + @JoinColumn(name = "OBJECT_ID")} + )) @IndexedEmbedded private LocalizedString description; @@ -260,6 +263,58 @@ public class ContentItem extends CcmObject implements Serializable { @Audited(targetAuditMode = RelationTargetAuditMode.NOT_AUDITED) private Workflow workflow; + /** + * Date when the item was created. This information is also available from + * the revision managed by Envers, but getting access to them involves some + * complex queries. Also it is not possible to get the creation date (date + * of the first entity) together with the last modified date (date of the + * last revision/current revision) of the item. + */ + @Column(name = "CREATION_DATE") + @Temporal(TemporalType.TIMESTAMP) + @NotAudited + private Date creationDate; + + /** + * Date the item was last modified. This information is also available from + * the revision managed by Envers, but getting access to them involves some + * complex queries. Also it is not possible to get the creation date (date + * of the first entity) together with the last modified date (date of the + * last revision/current revision) of the item. + */ + @Column(name = "LAST_MODIFIED") + @Temporal(TemporalType.TIMESTAMP) + @NotAudited + private Date lastModified; + + /** + * The name of the user which created the item. This information is also + * available from the revision managed by Envers, but getting access to them + * involves some complex queries. Also it is not possible to get the + * creation user (the user which created the first entity) together with the + * last modifying user (user which created the last revision/current + * revision) of the item. + * + * Please note that there is no grantee that the user still exists. + */ + @Column(name = "CREATION_USER_NAME") + @NotAudited + private String creationUserName; + + /** + * The name of the user which was the last one which modified the item. This + * information is also available from the revision managed by Envers, but + * getting access to them involves some complex queries. Also it is not + * possible to get the creation user (the user which created the first + * entity) together with the last modifying user (user which created the + * last revision/current revision) of the item. + * + * Please note that there is no grantee that the user still exists. + */ + @Column(name = "LAST_MODIFING_USER_NAME") + @NotAudited + private String lastModifyingUserName; + public ContentItem() { name = new LocalizedString(); title = new LocalizedString(); @@ -376,6 +431,38 @@ public class ContentItem extends CcmObject implements Serializable { this.workflow = workflow; } + public Date getCreationDate() { + return new Date(creationDate.getTime()); + } + + public void setCreationDate(final Date creationDate) { + this.creationDate = new Date(creationDate.getTime()); + } + + public Date getLastModified() { + return new Date(lastModified.getTime()); + } + + public void setLastModified(final Date lastModified) { + this.lastModified = new Date(lastModified.getTime()); + } + + public String getCreationUserName() { + return creationUserName; + } + + public void setCreationUserName(final String creationUserName) { + this.creationUserName = creationUserName; + } + + public String getLastModifyingUserName() { + return lastModifyingUserName; + } + + public void setLastModifyingUserName(final String lastModifyingUserName) { + this.lastModifyingUserName = lastModifyingUserName; + } + @Override public int hashCode() { int hash = super.hashCode(); @@ -446,18 +533,18 @@ public class ContentItem extends CcmObject implements Serializable { @Override public String toString(final String data) { return super.toString(String.format(", itemUuid = %s, " - + "name = %s, " -// + "contentType = { %s }, " - + "title = %s, " - + "description = %s, " - + "version = %s, " - + "launchDate = %s, " - + "lifecycle = { %s }, " - + "workflow = { %s }" - + "%s", + + "name = %s, " + // + "contentType = { %s }, " + + "title = %s, " + + "description = %s, " + + "version = %s, " + + "launchDate = %s, " + + "lifecycle = { %s }, " + + "workflow = { %s }" + + "%s", itemUuid, Objects.toString(name), -// Objects.toString(contentType), + // Objects.toString(contentType), Objects.toString(title), Objects.toString(description), Objects.toString(version), diff --git a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemRepository.java b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemRepository.java index c568e0166..36da3116b 100644 --- a/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemRepository.java +++ b/ccm-cms/src/main/java/org/librecms/contentsection/ContentItemRepository.java @@ -18,6 +18,7 @@ */ package org.librecms.contentsection; +import java.util.Date; import org.libreccm.auditing.AbstractAuditedEntityRepository; import org.libreccm.categorization.Category; import org.libreccm.core.CcmObject; @@ -31,6 +32,8 @@ import javax.enterprise.context.RequestScoped; import javax.inject.Inject; import javax.persistence.NoResultException; import javax.persistence.TypedQuery; +import org.libreccm.security.Shiro; +import org.libreccm.security.User; import org.libreccm.workflow.Workflow; /** @@ -47,6 +50,9 @@ public class ContentItemRepository @Inject private FolderRepository folderRepo; + + @Inject + private Shiro shiro; @Override public Long getEntityId(final ContentItem item) { @@ -346,5 +352,27 @@ public class ContentItemRepository return Optional.empty(); } } + + @Override + public void save(final ContentItem item) { + final Date now = new Date(); + final Optional user = shiro.getUser(); + final String userName; + if (user.isPresent()) { + userName = user.get().getName(); + } else { + userName = "--unknown--"; + } + + if (isNew(item)) { + item.setCreationDate(now); + item.setCreationUserName(userName); + } else { + item.setLastModified(now); + item.setLastModifyingUserName(userName); + } + + super.save(item); + } } diff --git a/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_10__add_item_auditing_data.sql b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_10__add_item_auditing_data.sql new file mode 100644 index 000000000..9c0e5944d --- /dev/null +++ b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/h2/V7_0_0_10__add_item_auditing_data.sql @@ -0,0 +1,12 @@ +alter table CCM_CMS.CONTENT_ITEMS + add column CREATION_DATE timestamp; + +alter table CCM_CMS.CONTENT_ITEMS + add column CREATION_USER_NAME varchar(255); + +alter table CCM_CMS.CONTENT_ITEMS + add column LAST_MODIFIED timestamp; + +alter table CCM_CMS.CONTENT_ITEMS + add column LAST_MODIFING_USER_NAME varchar(255); + diff --git a/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_10__add_item_auditing_data.sql b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_10__add_item_auditing_data.sql new file mode 100644 index 000000000..9c0e5944d --- /dev/null +++ b/ccm-cms/src/main/resources/db/migrations/org/librecms/ccm_cms/pgsql/V7_0_0_10__add_item_auditing_data.sql @@ -0,0 +1,12 @@ +alter table CCM_CMS.CONTENT_ITEMS + add column CREATION_DATE timestamp; + +alter table CCM_CMS.CONTENT_ITEMS + add column CREATION_USER_NAME varchar(255); + +alter table CCM_CMS.CONTENT_ITEMS + add column LAST_MODIFIED timestamp; + +alter table CCM_CMS.CONTENT_ITEMS + add column LAST_MODIFING_USER_NAME varchar(255); + diff --git a/ccm-cms/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_cms_schema.sql b/ccm-cms/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_cms_schema.sql index c0cb57c53..35e1f953c 100644 --- a/ccm-cms/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_cms_schema.sql +++ b/ccm-cms/src/test/resources-wildfly-remote-h2-mem/scripts/create_ccm_cms_schema.sql @@ -270,7 +270,11 @@ create schema CCM_CORE; create table CCM_CMS.CONTENT_ITEMS ( ANCESTORS varchar(1024), + CREATION_DATE timestamp, + CREATION_USER_NAME varchar(255), ITEM_UUID varchar(255) not null, + LAST_MODIFIED timestamp, + LAST_MODIFING_USER_NAME varchar(255), LAUNCH_DATE date, VERSION varchar(255), OBJECT_ID bigint not null, diff --git a/ccm-cms/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_cms_schema.sql b/ccm-cms/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_cms_schema.sql index 25bb8d923..d617a3845 100644 --- a/ccm-cms/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_cms_schema.sql +++ b/ccm-cms/src/test/resources-wildfly-remote-pgsql/scripts/create_ccm_cms_schema.sql @@ -270,7 +270,11 @@ create schema CCM_CORE; create table CCM_CMS.CONTENT_ITEMS ( ANCESTORS varchar(1024), + CREATION_DATE timestamp, + CREATION_USER_NAME varchar(255), ITEM_UUID varchar(255) not null, + LAST_MODIFIED timestamp, + LAST_MODIFING_USER_NAME varchar(255), LAUNCH_DATE date, VERSION varchar(255), OBJECT_ID int8 not null, diff --git a/ccm-cms/src/test/resources/datasets/create_ccm_cms_schema.sql b/ccm-cms/src/test/resources/datasets/create_ccm_cms_schema.sql index bf80fdeba..a4bccdde2 100644 --- a/ccm-cms/src/test/resources/datasets/create_ccm_cms_schema.sql +++ b/ccm-cms/src/test/resources/datasets/create_ccm_cms_schema.sql @@ -270,7 +270,11 @@ create schema CCM_CORE; create table CCM_CMS.CONTENT_ITEMS ( ANCESTORS varchar(1024), + CREATION_DATE timestamp, + CREATION_USER_NAME varchar(255), ITEM_UUID varchar(255) not null, + LAST_MODIFIED timestamp, + LAST_MODIFING_USER_NAME varchar(255), LAUNCH_DATE date, VERSION varchar(255), OBJECT_ID bigint not null,