Skip to content

Commit

Permalink
Merge branch 'release' into test/hubspot
Browse files Browse the repository at this point in the history
  • Loading branch information
Aishwarya-U-R committed Sep 27, 2023
2 parents 4f27802 + 2719225 commit 607dd26
Show file tree
Hide file tree
Showing 25 changed files with 246 additions and 84 deletions.
8 changes: 5 additions & 3 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ RUN rm -rf \
VOLUME [ "/appsmith-stacks" ]

# ------------------------------------------------------------------------
ENV TMP /tmp/appsmith
ENV TMP="/tmp/appsmith"
ENV NGINX_WWW_PATH="$TMP/www"

# Add backend server - Application Layer
ARG JAR_FILE=./app/server/dist/server-*.jar
Expand Down Expand Up @@ -81,9 +82,10 @@ COPY ./app/client/packages/rts/package.json ./app/client/packages/rts/dist rts/

RUN cd ./utils && npm install --only=prod && npm install --only=prod -g . && cd - \
&& chmod 0644 /etc/cron.d/* \
&& chmod +x entrypoint.sh renew-certificate.sh healthcheck.sh /watchtower-hooks/*.sh \
&& chmod +x entrypoint.sh renew-certificate.sh healthcheck.sh templates/nginx-app.conf.sh /watchtower-hooks/*.sh \
# Disable setuid/setgid bits for the files inside container.
&& find / \( -path /proc -prune \) -o \( \( -perm -2000 -o -perm -4000 \) -print -exec chmod -s '{}' + \) || true
&& find / \( -path /proc -prune \) -o \( \( -perm -2000 -o -perm -4000 \) -print -exec chmod -s '{}' + \) || true \
&& node prepare-image.mjs

# Update path to load appsmith utils tool as default
ENV PATH /opt/appsmith/utils/node_modules/.bin:$PATH
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
import com.appsmith.server.dtos.ce.ImportedActionAndCollectionMapsDTO;
import com.appsmith.server.helpers.ce.ImportApplicationPermissionProvider;
import com.appsmith.server.services.CrudService;
import com.mongodb.client.result.UpdateResult;
import com.mongodb.bulk.BulkWriteResult;
import org.springframework.data.domain.Sort;
import org.springframework.util.MultiValueMap;
import reactor.core.publisher.Flux;
Expand Down Expand Up @@ -138,7 +138,7 @@ Mono<ImportedActionAndCollectionMapsDTO> updateActionsWithImportedCollectionIds(
ImportActionCollectionResultDTO importActionCollectionResultDTO,
ImportActionResultDTO importActionResultDTO);

Mono<UpdateResult> publishActions(String applicationId, AclPermission permission);
Mono<List<BulkWriteResult>> publishActions(String applicationId, AclPermission permission);

Flux<PluginTypeAndCountDTO> countActionsByPluginType(String applicationId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@
import com.appsmith.server.solutions.DatasourcePermission;
import com.appsmith.server.solutions.PagePermission;
import com.appsmith.server.solutions.PolicySolution;
import com.mongodb.client.result.UpdateResult;
import com.mongodb.bulk.BulkWriteResult;
import io.micrometer.observation.ObservationRegistry;
import jakarta.validation.Validator;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -664,7 +664,7 @@ public Mono<NewAction> findById(String id) {

@Override
public Flux<NewAction> findAllById(Iterable<String> id) {
return repository.findAllById(id).flatMap(this::sanitizeAction);
return repository.findAllByIdIn(id).flatMap(this::sanitizeAction);
}

@Override
Expand Down Expand Up @@ -1908,7 +1908,7 @@ public Mono<ImportedActionAndCollectionMapsDTO> updateActionsWithImportedCollect
}

return repository
.findAllById(actionIds)
.findAllByIdIn(actionIds)
.map(newAction -> {
// Update collectionId and defaultCollectionIds in actionDTOs
ActionDTO unpublishedAction = newAction.getUnpublishedAction();
Expand Down Expand Up @@ -1960,12 +1960,13 @@ public Mono<ImportedActionAndCollectionMapsDTO> updateActionsWithImportedCollect
* This method is used to publish actions of an application. It does two things:
* 1. it deletes actions which are deleted from the edit mode.
* 2. It updates actions in bulk by setting publishedAction=unpublishedAction
*
* @param applicationId
* @param permission
* @return
*/
@Override
public Mono<UpdateResult> publishActions(String applicationId, AclPermission permission) {
public Mono<List<BulkWriteResult>> publishActions(String applicationId, AclPermission permission) {
// delete the actions that were deleted in edit mode
return repository
.archiveDeletedUnpublishedActions(applicationId, permission)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,9 @@ public Flux<T> findAll() {
.flatMapMany(principal -> {
Query query = new Query(notDeleted());
return mongoOperations.find(
query, entityInformation.getJavaType(), entityInformation.getCollectionName());
query.cursorBatchSize(10000),
entityInformation.getJavaType(),
entityInformation.getCollectionName());
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.appsmith.server.repositories.ce.CustomNewActionRepositoryCEImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.stereotype.Component;
Expand All @@ -14,7 +15,8 @@ public class CustomNewActionRepositoryImpl extends CustomNewActionRepositoryCEIm
public CustomNewActionRepositoryImpl(
ReactiveMongoOperations mongoOperations,
MongoConverter mongoConverter,
CacheableRepositoryHelper cacheableRepositoryHelper) {
super(mongoOperations, mongoConverter, cacheableRepositoryHelper);
CacheableRepositoryHelper cacheableRepositoryHelper,
MongoTemplate mongoTemplate) {
super(mongoOperations, mongoConverter, cacheableRepositoryHelper, mongoTemplate);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.appsmith.server.repositories.ce.CustomNewPageRepositoryCEImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.stereotype.Component;
Expand All @@ -13,7 +14,8 @@ public class CustomNewPageRepositoryImpl extends CustomNewPageRepositoryCEImpl i
public CustomNewPageRepositoryImpl(
ReactiveMongoOperations mongoOperations,
MongoConverter mongoConverter,
CacheableRepositoryHelper cacheableRepositoryHelper) {
super(mongoOperations, mongoConverter, cacheableRepositoryHelper);
CacheableRepositoryHelper cacheableRepositoryHelper,
MongoTemplate mongoTemplate) {
super(mongoOperations, mongoConverter, cacheableRepositoryHelper, mongoTemplate);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.data.mongodb.core.query.UpdateDefinition;
import org.springframework.data.mongodb.repository.Meta;
import org.springframework.security.core.context.ReactiveSecurityContextHolder;
import org.springframework.util.CollectionUtils;
import reactor.core.publisher.Flux;
Expand Down Expand Up @@ -166,7 +167,7 @@ public Mono<T> findById(String id, List<String> projectionFieldNames, Optional<A

return mongoOperations
.query(this.genericDomain)
.matching(query)
.matching(query.cursorBatchSize(10000))
.one()
.flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups));
});
Expand Down Expand Up @@ -331,6 +332,7 @@ protected Mono<T> queryOne(List<Criteria> criterias, List<String> projectionFiel
});
}

@Meta(cursorBatchSize = 10000)
protected Mono<T> queryOne(
List<Criteria> criterias, List<String> projectionFieldNames, Optional<AclPermission> permission) {
Mono<Set<String>> permissionGroupsMono = getCurrentUserPermissionGroupsIfRequired(permission);
Expand Down Expand Up @@ -539,7 +541,7 @@ public Flux<T> queryAllWithPermissionGroups(
sortOptional.ifPresent(sort -> query.with(sort));
return mongoOperations
.query(this.genericDomain)
.matching(query)
.matching(query.cursorBatchSize(10000))
.all()
.flatMap(obj -> setUserPermissionsInObject(obj, permissionGroups));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -78,7 +78,7 @@ Flux<NewAction> findAllNonJsActionsByNameAndPageIdsAndViewMode(

Mono<List<BulkWriteResult>> bulkUpdate(List<NewAction> newActions);

Mono<UpdateResult> publishActions(String applicationId, AclPermission permission);
Mono<List<BulkWriteResult>> publishActions(String applicationId, AclPermission permission);

Mono<UpdateResult> archiveDeletedUnpublishedActions(String applicationId, AclPermission permission);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,12 @@
import org.bson.Document;
import org.bson.types.ObjectId;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationUpdate;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.Fields;
import org.springframework.data.mongodb.core.aggregation.GroupOperation;
import org.springframework.data.mongodb.core.aggregation.MatchOperation;
import org.springframework.data.mongodb.core.aggregation.ProjectionOperation;
Expand Down Expand Up @@ -52,11 +55,15 @@
public class CustomNewActionRepositoryCEImpl extends BaseAppsmithRepositoryImpl<NewAction>
implements CustomNewActionRepositoryCE {

private final MongoTemplate mongoTemplate;

public CustomNewActionRepositoryCEImpl(
ReactiveMongoOperations mongoOperations,
MongoConverter mongoConverter,
CacheableRepositoryHelper cacheableRepositoryHelper) {
CacheableRepositoryHelper cacheableRepositoryHelper,
MongoTemplate mongoTemplate) {
super(mongoOperations, mongoConverter, cacheableRepositoryHelper);
this.mongoTemplate = mongoTemplate;
}

@Override
Expand Down Expand Up @@ -571,16 +578,33 @@ public Flux<NewAction> findByDefaultApplicationId(String defaultApplicationId, O
}

@Override
public Mono<UpdateResult> publishActions(String applicationId, AclPermission permission) {
public Mono<List<BulkWriteResult>> publishActions(String applicationId, AclPermission permission) {
Criteria applicationIdCriteria =
where(fieldName(QNewAction.newAction.applicationId)).is(applicationId);
// using aggregation update instead of regular update here
// it's required to set a field to a value of another field from the same domain
AggregationUpdate aggregationUpdate = AggregationUpdate.update()
.set(fieldName(QNewAction.newAction.publishedAction))
.toValue("$" + fieldName(QNewAction.newAction.unpublishedAction));

return updateByCriteria(List.of(applicationIdCriteria), aggregationUpdate, permission);
Mono<Set<String>> permissionGroupsMono =
getCurrentUserPermissionGroupsIfRequired(Optional.ofNullable(permission));

return permissionGroupsMono.flatMap(permissionGroups -> {
AggregationOperation matchAggregationWithPermission = null;
if (permission == null) {
matchAggregationWithPermission = Aggregation.match(new Criteria().andOperator(notDeleted()));
} else {
matchAggregationWithPermission = Aggregation.match(
new Criteria().andOperator(notDeleted(), userAcl(permissionGroups, permission)));
}
AggregationOperation matchAggregation = Aggregation.match(applicationIdCriteria);
AggregationOperation wholeProjection = Aggregation.project(NewAction.class);
AggregationOperation addFieldsOperation = Aggregation.addFields()
.addField(fieldName(QNewAction.newAction.publishedAction))
.withValueOf(Fields.field(fieldName(QNewAction.newAction.unpublishedAction)))
.build();
Aggregation combinedAggregation = Aggregation.newAggregation(
matchAggregation, matchAggregationWithPermission, wholeProjection, addFieldsOperation);
AggregationResults<NewAction> updatedResults =
mongoTemplate.aggregate(combinedAggregation, NewAction.class, NewAction.class);
return bulkUpdate(updatedResults.getMappedResults());
});
}

@Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import com.appsmith.server.acl.AclPermission;
import com.appsmith.server.domains.NewPage;
import com.appsmith.server.repositories.AppsmithRepository;
import com.mongodb.client.result.UpdateResult;
import com.mongodb.bulk.BulkWriteResult;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

Expand Down Expand Up @@ -43,5 +43,7 @@ Mono<NewPage> findByGitSyncIdAndDefaultApplicationId(
Mono<NewPage> findByGitSyncIdAndDefaultApplicationId(
String defaultApplicationId, String gitSyncId, Optional<AclPermission> permission);

Mono<UpdateResult> publishPages(Collection<String> pageIds, AclPermission permission);
Mono<List<BulkWriteResult>> publishPages(Collection<String> pageIds, AclPermission permission);

Mono<List<BulkWriteResult>> bulkUpdate(List<NewPage> newPages);
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,32 +9,48 @@
import com.appsmith.server.dtos.PageDTO;
import com.appsmith.server.repositories.BaseAppsmithRepositoryImpl;
import com.appsmith.server.repositories.CacheableRepositoryHelper;
import com.mongodb.client.result.UpdateResult;
import com.mongodb.bulk.BulkWriteResult;
import com.mongodb.client.model.UpdateOneModel;
import com.mongodb.client.model.WriteModel;
import lombok.extern.slf4j.Slf4j;
import org.bson.Document;
import org.bson.types.ObjectId;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.ReactiveMongoOperations;
import org.springframework.data.mongodb.core.aggregation.AggregationUpdate;
import org.springframework.data.mongodb.core.aggregation.Aggregation;
import org.springframework.data.mongodb.core.aggregation.AggregationOperation;
import org.springframework.data.mongodb.core.aggregation.AggregationResults;
import org.springframework.data.mongodb.core.aggregation.Fields;
import org.springframework.data.mongodb.core.convert.MongoConverter;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.util.CollectionUtils;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
import java.util.Set;
import java.util.stream.Collectors;

import static org.springframework.data.mongodb.core.query.Criteria.where;

@Slf4j
public class CustomNewPageRepositoryCEImpl extends BaseAppsmithRepositoryImpl<NewPage>
implements CustomNewPageRepositoryCE {

private final MongoTemplate mongoTemplate;

public CustomNewPageRepositoryCEImpl(
ReactiveMongoOperations mongoOperations,
MongoConverter mongoConverter,
CacheableRepositoryHelper cacheableRepositoryHelper) {
CacheableRepositoryHelper cacheableRepositoryHelper,
MongoTemplate mongoTemplate) {
super(mongoOperations, mongoConverter, cacheableRepositoryHelper);
this.mongoTemplate = mongoTemplate;
}

@Override
Expand Down Expand Up @@ -251,14 +267,55 @@ public Mono<NewPage> findByGitSyncIdAndDefaultApplicationId(
}

@Override
public Mono<UpdateResult> publishPages(Collection<String> pageIds, AclPermission permission) {
public Mono<List<BulkWriteResult>> publishPages(Collection<String> pageIds, AclPermission permission) {
Criteria applicationIdCriteria = where(fieldName(QNewPage.newPage.id)).in(pageIds);
// using aggregation update instead of regular update here
// it's required to set a field to a value of another field from the same domain
AggregationUpdate aggregationUpdate = AggregationUpdate.update()
.set(fieldName(QNewPage.newPage.publishedPage))
.toValue("$" + fieldName(QNewPage.newPage.unpublishedPage));

return updateByCriteria(List.of(applicationIdCriteria), aggregationUpdate, permission);
Mono<Set<String>> permissionGroupsMono =
getCurrentUserPermissionGroupsIfRequired(Optional.ofNullable(permission));

return permissionGroupsMono.flatMap(permissionGroups -> {
AggregationOperation matchAggregationWithPermission = null;
if (permission == null) {
matchAggregationWithPermission = Aggregation.match(new Criteria().andOperator(notDeleted()));
} else {
matchAggregationWithPermission = Aggregation.match(
new Criteria().andOperator(notDeleted(), userAcl(permissionGroups, permission)));
}
AggregationOperation matchAggregation = Aggregation.match(applicationIdCriteria);
AggregationOperation wholeProjection = Aggregation.project(NewPage.class);
AggregationOperation addFieldsOperation = Aggregation.addFields()
.addField(fieldName(QNewPage.newPage.publishedPage))
.withValueOf(Fields.field(fieldName(QNewPage.newPage.unpublishedPage)))
.build();
Aggregation combinedAggregation = Aggregation.newAggregation(
matchAggregation, matchAggregationWithPermission, wholeProjection, addFieldsOperation);
AggregationResults<NewPage> updatedResults =
mongoTemplate.aggregate(combinedAggregation, NewPage.class, NewPage.class);
return bulkUpdate(updatedResults.getMappedResults());
});
}

@Override
public Mono<List<BulkWriteResult>> bulkUpdate(List<NewPage> newPages) {
if (CollectionUtils.isEmpty(newPages)) {
return Mono.just(Collections.emptyList());
}

// convert the list of new pages to a list of DBObjects
List<WriteModel<Document>> dbObjects = newPages.stream()
.map(newPage -> {
assert newPage.getId() != null;
Document document = new Document();
mongoOperations.getConverter().write(newPage, document);
document.remove("_id");
return (WriteModel<Document>) new UpdateOneModel<Document>(
new Document("_id", new ObjectId(newPage.getId())), new Document("$set", document));
})
.collect(Collectors.toList());

return mongoOperations
.getCollection(mongoOperations.getCollectionName(NewPage.class))
.flatMapMany(documentMongoCollection -> documentMongoCollection.bulkWrite(dbObjects))
.collectList();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,17 @@
import com.appsmith.server.domains.NewAction;
import com.appsmith.server.repositories.BaseRepository;
import com.appsmith.server.repositories.CustomNewActionRepository;
import org.springframework.data.mongodb.repository.Meta;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

public interface NewActionRepositoryCE extends BaseRepository<NewAction, String>, CustomNewActionRepository {

@Meta(cursorBatchSize = 10000)
Flux<NewAction> findByApplicationId(String applicationId);

@Meta(cursorBatchSize = 10000)
Flux<NewAction> findAllByIdIn(Iterable<String> ids);

Mono<Long> countByDeletedAtNull();
}
Loading

0 comments on commit 607dd26

Please sign in to comment.