diff --git a/README.md b/README.md
index 4d96d56..04554fa 100644
--- a/README.md
+++ b/README.md
@@ -139,7 +139,7 @@ Before you begin, ensure you have the following installed:
* Navigate to the "WAR file to deploy" section.
* Choose the `shorten.war` file using the file upload button.
* Click the "Deploy" button.
-3. **Configure environment variables:**
+3. **Configure Variables on deployed war:**
Set environment variables for cloud-specific settings.
@@ -246,7 +246,27 @@ Wait until the pod is in the "Running" state.
Access your application using the provided external IP.
+### SMS Service Configuration
+To configure the SMS service, you need to specify parameters related to the SMS provider in the `application.properties` file.
+
+* #### Managed SMS Provider (Uses HttpSms API from https://httpsms.com/)
+ * Generate API Key : https://httpsms.com/settings/
+ * HttpSms API Docs : https://api.httpsms.com/
+
+ ```properties
+ sms.provider=managed
+ managed.sms.api.key=your_managed_sms_api_key
+ managed.sms.phone-number=123456789
+
+* #### Self-hosted SMS Provider (Host our open source android-based SMS web gateway : https://api.httpsms.com/)
+
+ ```properties
+ sms.provider=selfhosted
+ selfhosted.gateway.url=https://your-smsgateway-url/index.php
+ selfhosted.device.id=your_device_id
+ selfhosted.hash=your_device_hash
+
### App Health
* Check application status from the /monitoring page example http://localhost:8080/monitoring
diff --git a/src/main/java/com/bitmutex/shortener/SmsService.java b/src/main/java/com/bitmutex/shortener/SmsService.java
index 911df8b..d14aa85 100644
--- a/src/main/java/com/bitmutex/shortener/SmsService.java
+++ b/src/main/java/com/bitmutex/shortener/SmsService.java
@@ -5,41 +5,88 @@ import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;
import java.net.URI;
+import java.net.URLEncoder;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
+import java.nio.charset.StandardCharsets;
+
@Service
public class SmsService {
+ private final SmsServiceConfig smsServiceConfig;
+
private static final Logger logger = LoggerFactory.getLogger(SmsService.class);
+ public SmsService(SmsServiceConfig smsServiceConfig) {
+ this.smsServiceConfig = smsServiceConfig;
+ }
+
public void sendSms(String toNumber, String message) {
try {
- // Send the SMS to the user (you need to implement this part)
- var client = HttpClient.newHttpClient();
- var apiKey = "Vucf1nCa4ed-AMNGv6CnsycfQT28yLUA8NEvY7IZ87-Piv855UBcjfo29Zb8XPZt";
-
- String payload = "{\n" +
- " \"content\": \"" + message + "\",\n" + // Use concatenation for variables
- " \"from\": \"+9038556097\",\n" +
- " \"to\": \"" + toNumber + "\"\n" +
- "}";
-
- var requestBuild = HttpRequest.newBuilder()
- .uri(URI.create("https://api.httpsms.com/v1/messages/send"))
- .header("accept", "application/json")
- .header("Content-Type", "application/json")
- .header("x-api-key", apiKey)
- .POST(HttpRequest.BodyPublishers.ofString(payload))
- .build();
-
- var response = client.send(requestBuild, HttpResponse.BodyHandlers.ofString());
- System.out.println(response.body());
+ if ("managed".equals(smsServiceConfig.getSmsProvider())) {
+ sendSmsToManagedProvider(toNumber, message);
+ } else if ("selfhosted".equals(smsServiceConfig.getSmsProvider())) {
+ sendSmsToSelfHostedGateway(toNumber, message);
+ } else {
+ logger.error("Invalid SMS provider configuration");
+ }
logger.info("SMS sent successfully to {}", toNumber);
- logger.debug("SMS API response: {}", response.body());
} catch (Exception e) {
// Log and handle SMS sending failure
logger.error("Failed to send SMS to {}: {}", toNumber, e.getMessage(), e);
}
}
-}
+
+ private void sendSmsToManagedProvider(String toNumber, String message) throws Exception {
+ var client = HttpClient.newHttpClient();
+
+ var apiKey = smsServiceConfig.getManagedSmsApiKey();
+ var phoneNumber = smsServiceConfig.getManagedPhoneNumber();
+
+ String payload = "{\n" +
+ " \"content\": \"" + message + "\",\n" +
+ " \"from\": \"+"+ phoneNumber + "\",\n" +
+ " \"to\": \"" + toNumber + "\"\n" +
+ "}";
+
+ var requestBuild = HttpRequest.newBuilder()
+ .uri(URI.create("https://api.httpsms.com/v1/messages/send"))
+ .header("accept", "application/json")
+ .header("Content-Type", "application/json")
+ .header("x-api-key", apiKey)
+ .POST(HttpRequest.BodyPublishers.ofString(payload))
+ .build();
+
+ var response = client.send(requestBuild, HttpResponse.BodyHandlers.ofString());
+ System.out.println(response.body());
+ logger.info("External SMS API response: {}", response.body());
+ }
+
+ private void sendSmsToSelfHostedGateway(String toNumber, String message) throws Exception {
+ // Replace with your actual SMSGateway server URL, device ID, and hash
+
+ String gatewayUrl = smsServiceConfig.getSelfHostedGatewayUrl();
+ String deviceId = smsServiceConfig.getSelfHostedDeviceId();
+ String hash = smsServiceConfig.getSelfHostedHash();
+
+ // Encode special characters in the message
+ String encodedMessage = URLEncoder.encode(message, StandardCharsets.UTF_8.toString());
+
+ // Build the final URL
+ var finalUrl = String.format("%s?id=%s&h=%s&to=%s&message=%s", gatewayUrl, deviceId, hash, toNumber, encodedMessage);
+
+ var client = HttpClient.newHttpClient();
+
+ var requestBuild = HttpRequest.newBuilder()
+ .uri(URI.create(finalUrl))
+ .header("accept", "application/json")
+ .header("Content-Type", "application/json")
+ .GET()
+ .build();
+
+ var response = client.send(requestBuild, HttpResponse.BodyHandlers.ofString());
+ System.out.println(response.body());
+ logger.info("SMSGateway API response: {}", response.body());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/bitmutex/shortener/SmsServiceConfig.java b/src/main/java/com/bitmutex/shortener/SmsServiceConfig.java
new file mode 100644
index 0000000..61c806e
--- /dev/null
+++ b/src/main/java/com/bitmutex/shortener/SmsServiceConfig.java
@@ -0,0 +1,50 @@
+package com.bitmutex.shortener;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class SmsServiceConfig {
+
+ @Value("${sms.provider}")
+ private String smsProvider;
+
+ @Value("${managed.sms.api.key}")
+ private String managedSmsApiKey;
+
+ @Value("${managed.sms.phone-number}")
+ private String managedPhoneNumber;
+
+ @Value("${selfhosted.gateway.url}")
+ private String selfHostedGatewayUrl;
+
+ @Value("${selfhosted.device.id}")
+ private String selfHostedDeviceId;
+
+ @Value("${selfhosted.hash}")
+ private String selfHostedHash;
+
+ public String getSmsProvider() {
+ return smsProvider;
+ }
+
+ public String getManagedPhoneNumber() {
+ return managedPhoneNumber;
+ }
+
+ public String getManagedSmsApiKey() {
+ return managedSmsApiKey;
+ }
+
+ public String getSelfHostedGatewayUrl() {
+ return selfHostedGatewayUrl;
+ }
+
+ public String getSelfHostedDeviceId() {
+ return selfHostedDeviceId;
+ }
+
+ public String getSelfHostedHash() {
+ return selfHostedHash;
+ }
+}
diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties
index 5163d9c..11a9072 100644
--- a/src/main/resources/application.properties
+++ b/src/main/resources/application.properties
@@ -91,9 +91,20 @@ springdoc.api-docs.path=/docs
springdoc.swagger-ui.path=/docs-ui
springdoc.swagger-ui.operationsSorter=method
springdoc.show-actuator=true
-
+#Springdoc Swagger Config
springdoc.swagger-ui.oauthClientId=Iv1.8d3d0ea51b7e7da3
springdoc.swagger-ui.oauthClientSecret=2176086761d073b2082afdc4af0207fa7d1d274b
springdoc.swagger-ui.oauthAppName=Bitmutex Shortener
springdoc.swagger-ui.oauthScopeSeparator=/v
springdoc.swagger-ui.showRequestHeaders=true
+
+
+# SMS Provider Configuration (managed/selfhosted)
+sms.provider=selfhosted
+# For Managed SMS Provider (uses httpSms API from https://httpsms.com/settings)
+managed.sms.api.key=Vucf1nCa4ed-AMNGv6CnsycfQT28yLUA8NEvY7IZ87-Piv855UBcjfo29Zb8XPZt
+managed.sms.phone-number=9038556097
+# For Self-Hosted SMSGateway (android app url : https://bitmutexsms.000webhostapp.com/index.php?id=f0edf9a81c2461b5&h=b4132c)
+selfhosted.gateway.url=https://bitmutexsms.000webhostapp.com/index.php
+selfhosted.device.id=f0edf9a81c2461b5
+selfhosted.hash=b4132c
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index 44d73d2..098ca5a 100644
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -17,10 +17,13 @@
%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
-
- ${LOG_ARCHIVE}/shortener.log.%d{yyyy-MM-dd}.log
+
+ ${LOG_PATH}/shortener.log.%d{yyyy-MM-dd}.%i.zip
+ 1
+ 4
+
30
- 10MB
+ 5MB
1GB
true
@@ -33,7 +36,7 @@
-
+