Skip to content

Commit d7e2f67

Browse files
Merge pull request #11 from Bitcoin-com/0.0.4-SNAPSHOT
Release 0.0.4
2 parents 0225cfe + 4bc7449 commit d7e2f67

File tree

55 files changed

+1610
-448
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+1610
-448
lines changed

build.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
rm -rf build
2+
mkdir "build"
3+
mvn -f slp-indexer-service/pom.xml clean install --log-file build/slp-indexer-service.txt
4+
cp slp-indexer-service/slp-indexer-service-app/target/slp-indexer-service-app-0.0.1-SNAPSHOT-exec.jar build/slp-indexer-service-0.0-1.jar
5+
6+
mvn -f slp-indexer-api-service/pom.xml clean install --log-file build/slp-indexer-api-service.txt
7+
cp slp-indexer-api-service/slp-indexer-api-service-app/target/slp-indexer-api-service-app-0.0.1-SNAPSHOT-exec.jar build/slp-indexer-api-service-0.0-1.jar

slp-indexer-api-service/pom.xml

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55

66
<groupId>com.bitcoin.indexer</groupId>
77
<artifactId>slp-indexer-api-service</artifactId>
8-
<version>0.0.3</version>
8+
<version>0.0.4</version>
99
<packaging>pom</packaging>
1010

1111
<name>API</name>
@@ -14,7 +14,7 @@
1414
<parent>
1515
<groupId>org.springframework.boot</groupId>
1616
<artifactId>spring-boot-starter-parent</artifactId>
17-
<version>2.1.2.RELEASE</version>
17+
<version>2.2.5.RELEASE</version>
1818
<relativePath/> <!-- lookup parent from repository -->
1919
</parent>
2020

@@ -28,25 +28,25 @@
2828
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
2929
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
3030
<java.version>11</java.version>
31-
<spring.boot.starter.version>2.1.2.RELEASE</spring.boot.starter.version>
31+
<spring.boot.starter.version>2.2.5.RELEASE</spring.boot.starter.version>
3232
</properties>
3333

3434
<dependencyManagement>
3535
<dependencies>
3636
<dependency>
3737
<groupId>com.bitcoin.indexer</groupId>
3838
<artifactId>slp-indexer-api-service-domain</artifactId>
39-
<version>0.0.3</version>
39+
<version>0.0.4</version>
4040
</dependency>
4141
<dependency>
4242
<groupId>com.bitcoin.indexer</groupId>
4343
<artifactId>slp-indexer-api-service-app</artifactId>
44-
<version>0.0.3</version>
44+
<version>0.0.4</version>
4545
</dependency>
4646
<dependency>
4747
<groupId>com.bitcoin.indexer</groupId>
4848
<artifactId>slp-indexer-api-service-integration-test</artifactId>
49-
<version>0.0.3</version>
49+
<version>0.0.4</version>
5050
</dependency>
5151

5252
<dependency>

slp-indexer-api-service/slp-indexer-api-service-app/pom.xml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88
<parent>
99
<groupId>com.bitcoin.indexer</groupId>
1010
<artifactId>slp-indexer-api-service</artifactId>
11-
<version>0.0.3</version>
11+
<version>0.0.4</version>
1212
</parent>
1313

1414
<artifactId>slp-indexer-api-service-app</artifactId>
15-
<version>0.0.3</version>
15+
<version>0.0.4</version>
1616

1717
<dependencies>
1818
<dependency>
@@ -35,7 +35,7 @@
3535
<dependency>
3636
<groupId>com.bitcoin.indexer</groupId>
3737
<artifactId>slp-indexer-service-domain</artifactId>
38-
<version>0.0.3</version>
38+
<version>0.0.4</version>
3939
</dependency>
4040

4141
<dependency>

slp-indexer-api-service/slp-indexer-api-service-app/src/main/java/com/bitcoin/indexer/config/Config.java

Lines changed: 112 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,19 @@
22

33
import java.util.concurrent.TimeUnit;
44

5+
import org.bson.Document;
56
import org.slf4j.Logger;
67
import org.slf4j.LoggerFactory;
8+
import org.springframework.beans.factory.InitializingBean;
9+
import org.springframework.beans.factory.annotation.Autowired;
710
import org.springframework.beans.factory.annotation.Value;
811
import org.springframework.context.annotation.Bean;
912
import org.springframework.context.annotation.Configuration;
13+
import org.springframework.data.domain.Sort.Direction;
1014
import org.springframework.data.mongodb.core.MongoOperations;
1115
import org.springframework.data.mongodb.core.ReactiveMongoTemplate;
16+
import org.springframework.data.mongodb.core.index.CompoundIndexDefinition;
17+
import org.springframework.data.mongodb.core.index.Index;
1218

1319
import com.bitcoin.indexer.core.Coin;
1420
import com.bitcoin.indexer.facade.InsightsFacade;
@@ -19,15 +25,21 @@
1925
import com.bitcoin.indexer.repository.TransactionRepositoryImpl;
2026
import com.bitcoin.indexer.repository.UtxoRepository;
2127
import com.bitcoin.indexer.repository.UtxoRepositoryImpl;
28+
import com.bitcoin.indexer.repository.db.AllOutputsDbObject;
29+
import com.bitcoin.indexer.repository.db.BlockDbObject;
30+
import com.bitcoin.indexer.repository.db.TransactionDbObject;
2231
import com.mongodb.MongoClientOptions;
2332

2433
import okhttp3.OkHttpClient;
2534

2635
@Configuration
27-
public class Config {
36+
public class Config implements InitializingBean {
2837

2938
private static final Logger logger = LoggerFactory.getLogger(Config.class);
3039

40+
@Autowired
41+
public ReactiveMongoTemplate reactiveMongoTemplate;
42+
3143
@Bean
3244
public Coin coin() {
3345
return Coin.BCH;
@@ -61,4 +73,103 @@ public UtxoRepository utxoRepository(ReactiveMongoTemplate reactiveMongoTemplate
6173
public SlpDetailsRepository detailsRepository(ReactiveMongoTemplate reactiveMongoTemplate) {
6274
return new SlpDetailsRepositoryImpl(reactiveMongoTemplate);
6375
}
76+
77+
@Value("${spring.data.mongodb.database}")
78+
String mongoDb;
79+
80+
@Override
81+
public void afterPropertiesSet() throws Exception {
82+
logger.info("Running for database={}", mongoDb);
83+
ReactiveMongoTemplate mongoTemplate = reactiveMongoTemplate;
84+
mongoTemplate.indexOps(AllOutputsDbObject.class).ensureIndex(new Index("address", Direction.ASC).named("address_output")).block();
85+
mongoTemplate.indexOps(AllOutputsDbObject.class).ensureIndex(new Index("txId", Direction.ASC).named("txId_output")).block();
86+
87+
Document document = new Document();
88+
document.put("address", 1);
89+
document.put("isSpent", 1);
90+
mongoTemplate.indexOps(AllOutputsDbObject.class).ensureIndex(new CompoundIndexDefinition(
91+
document
92+
).named("address_spent_output")).block();
93+
94+
document = new Document();
95+
document.put("address", 1);
96+
document.put("isSpent", 1);
97+
document.put("slpUtxoType.parentTransactionValid.valid", 1);
98+
mongoTemplate.indexOps(AllOutputsDbObject.class).ensureIndex(new CompoundIndexDefinition(
99+
document
100+
).named("address_spent_valid_output")).block();
101+
102+
document = new Document();
103+
document.put("slpUtxoType.slpTokenId", 1);
104+
document.put("slpUtxoType.hasBaton", 1);
105+
mongoTemplate.indexOps(AllOutputsDbObject.class).ensureIndex(new CompoundIndexDefinition(
106+
document
107+
).named("tokenId_baton_output")).block();
108+
109+
document = new Document();
110+
document.put("slpUtxoType.slpTokenId", 1);
111+
document.put("slpUtxoType.amount", 1);
112+
document.put("isSpent", 1);
113+
mongoTemplate.indexOps(AllOutputsDbObject.class).ensureIndex(new CompoundIndexDefinition(
114+
document
115+
).named("tokenId_amount_spent_output")).block();
116+
117+
document = new Document();
118+
document.put("slpUtxoType.slpTokenId", 1);
119+
document.put("isSpent", 1);
120+
document.put("slpUtxoType.parentTransactionValid.valid", 1);
121+
mongoTemplate.indexOps(AllOutputsDbObject.class).ensureIndex(new CompoundIndexDefinition(
122+
document
123+
).named("tokenId_spent_valid_output")).block();
124+
125+
document = new Document();
126+
document.put("slpUtxoType.slpTokenId", 1);
127+
document.put("isSpent", 1);
128+
mongoTemplate.indexOps(AllOutputsDbObject.class).ensureIndex(new CompoundIndexDefinition(
129+
document
130+
).named("tokenId_spent_output")).block();
131+
132+
document = new Document();
133+
document.put("_id", 1);
134+
document.put("slpValid.valid", 1);
135+
mongoTemplate.indexOps(TransactionDbObject.class).ensureIndex(new CompoundIndexDefinition(
136+
document
137+
).named("txId_valid_tx")).block();
138+
139+
document = new Document();
140+
document.put("_id", 1);
141+
document.put("slpValid.valid", 1);
142+
document.put("outputs.slpUtxoType.slpTokenId", 1);
143+
mongoTemplate.indexOps(TransactionDbObject.class).ensureIndex(new CompoundIndexDefinition(
144+
document
145+
).named("txId_valid_tokenId_tx")).block();
146+
147+
document = new Document();
148+
document.put("slpValid.valid", 1);
149+
document.put("outputs.slpUtxoType.slpTokenId", 1);
150+
mongoTemplate.indexOps(TransactionDbObject.class).ensureIndex(new CompoundIndexDefinition(
151+
document
152+
).named("valid_tokenId_tx")).block();
153+
154+
mongoTemplate.indexOps(TransactionDbObject.class)
155+
.ensureIndex(new Index("outputs.slpUtxoType.slpTokenId", Direction.ASC).named("tokenId_tx")).block();
156+
157+
mongoTemplate.indexOps(TransactionDbObject.class)
158+
.ensureIndex(new Index("time", Direction.DESC).named("time_tx")).block();
159+
160+
mongoTemplate.indexOps(TransactionDbObject.class).ensureIndex(new Index(
161+
"inputs.address", Direction.ASC)
162+
.named("input_addr").background()).block();
163+
164+
mongoTemplate.indexOps(TransactionDbObject.class).ensureIndex(new Index(
165+
"outputs.address", Direction.ASC)
166+
.named("output_addr").background()).block();
167+
168+
mongoTemplate.indexOps(AllOutputsDbObject.class)
169+
.ensureIndex(new Index("slpUtxoType.slpTokenId", Direction.ASC).named("tokenId_output")).block();
170+
171+
mongoTemplate.indexOps(BlockDbObject.class)
172+
.ensureIndex(new Index("height", Direction.ASC).named("block_height")).block();
173+
174+
}
64175
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
package com.bitcoin.indexer.controllers;
2+
3+
import java.util.Map;
4+
5+
import javax.servlet.http.HttpServletRequest;
6+
7+
import org.slf4j.Logger;
8+
import org.slf4j.LoggerFactory;
9+
import org.springframework.boot.autoconfigure.web.ErrorProperties;
10+
import org.springframework.boot.autoconfigure.web.ErrorProperties.IncludeStacktrace;
11+
import org.springframework.boot.web.servlet.error.DefaultErrorAttributes;
12+
import org.springframework.boot.web.servlet.error.ErrorAttributes;
13+
import org.springframework.boot.web.servlet.error.ErrorController;
14+
import org.springframework.http.HttpStatus;
15+
import org.springframework.http.MediaType;
16+
import org.springframework.http.ResponseEntity;
17+
import org.springframework.stereotype.Controller;
18+
import org.springframework.web.HttpMediaTypeNotAcceptableException;
19+
import org.springframework.web.bind.annotation.ExceptionHandler;
20+
import org.springframework.web.bind.annotation.RequestMapping;
21+
import org.springframework.web.context.request.ServletWebRequest;
22+
import org.springframework.web.context.request.WebRequest;
23+
24+
@Controller
25+
public class CustomErrorController implements ErrorController {
26+
27+
private final ErrorProperties errorProperties = new ErrorProperties();
28+
private final ErrorAttributes errorAttributes = new DefaultErrorAttributes(true);
29+
private static final Logger logger = LoggerFactory.getLogger(CustomErrorController.class);
30+
31+
@RequestMapping("/error")
32+
public ResponseEntity<Map<String, Object>> error(HttpServletRequest request) {
33+
HttpStatus status = this.getStatus(request);
34+
if (status == HttpStatus.NO_CONTENT) {
35+
logger.error("Error thrown returning only status={}", status);
36+
return new ResponseEntity(status);
37+
} else {
38+
Map<String, Object> body = this.getErrorAttributes(request, this.isIncludeStackTrace(request, MediaType.ALL));
39+
ResponseEntity responseEntity = new ResponseEntity(body, status);
40+
logger.error("Error thrown returning={}", body.entrySet());
41+
return responseEntity;
42+
}
43+
}
44+
45+
@ExceptionHandler({ HttpMediaTypeNotAcceptableException.class })
46+
public ResponseEntity<String> mediaTypeNotAcceptable(HttpServletRequest request) {
47+
HttpStatus status = this.getStatus(request);
48+
return ResponseEntity.status(status).build();
49+
}
50+
51+
protected boolean isIncludeStackTrace(HttpServletRequest request, MediaType produces) {
52+
IncludeStacktrace include = this.getErrorProperties().getIncludeStacktrace();
53+
if (include == IncludeStacktrace.ALWAYS) {
54+
return true;
55+
} else {
56+
return include == IncludeStacktrace.ON_TRACE_PARAM && this.getTraceParameter(request);
57+
}
58+
}
59+
60+
protected ErrorProperties getErrorProperties() {
61+
return this.errorProperties;
62+
}
63+
64+
public HttpStatus getStatus(HttpServletRequest request) {
65+
Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
66+
if (statusCode == null) {
67+
return HttpStatus.INTERNAL_SERVER_ERROR;
68+
} else {
69+
try {
70+
return HttpStatus.valueOf(statusCode);
71+
} catch (Exception var4) {
72+
return HttpStatus.INTERNAL_SERVER_ERROR;
73+
}
74+
}
75+
}
76+
77+
@Override
78+
public String getErrorPath() {
79+
return "error";
80+
}
81+
82+
protected Map<String, Object> getErrorAttributes(HttpServletRequest request, boolean includeStackTrace) {
83+
WebRequest webRequest = new ServletWebRequest(request);
84+
return this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace);
85+
}
86+
87+
protected boolean getTraceParameter(HttpServletRequest request) {
88+
String parameter = request.getParameter("trace");
89+
if (parameter == null) {
90+
return false;
91+
} else {
92+
return !"false".equalsIgnoreCase(parameter);
93+
}
94+
}
95+
}

0 commit comments

Comments
 (0)