package com.twilio.jwt.taskrouter;
import com.google.common.collect.Lists;
import com.twilio.jwt.Jwt;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* JWT builder for TaskRouter Capabilities.
*/
public class TaskRouterCapability extends Jwt {
private final String accountSid;
private final String workspaceSid;
private final String friendlyName;
private final String channelId;
private final List<Policy> policies;
private TaskRouterCapability(Builder b) {
super(
SignatureAlgorithm.HS256,
b.authToken,
b.accountSid,
new Date(new Date().getTime() + b.ttl * 1000)
);
this.accountSid = b.accountSid;
this.workspaceSid = b.workspaceSid;
this.channelId = b.channelId;
this.friendlyName = b.friendlyName;
this.policies = b.policies;
}
@Override
public Map<String, Object> getHeaders() {
Map<String, Object> headers = new HashMap<>();
headers.put("alg", "HS256");
return headers;
}
@Override
public Map<String, Object> getClaims() {
Map<String, Object> payload = new HashMap<>();
payload.put("version", "v1");
payload.put("account_sid", this.accountSid);
payload.put("friendly_name", this.friendlyName);
payload.put("workspace_sid", this.workspaceSid);
payload.put("channel", this.channelId);
if (channelId.startsWith("WK")) {
payload.put("worker_sid", this.channelId);
} else if (channelId.startsWith("WQ")) {
payload.put("taskqueue_sid", this.channelId);
}
List<Policy> payloadPolicies = Lists.newArrayList(this.policies);
payloadPolicies.addAll(PolicyUtils.defaultEventBridgePolicies(accountSid, channelId));
payload.put("policies", payloadPolicies);
return payload;
}
public static class Builder {
private String accountSid;
private String authToken;
private String workspaceSid;
private String channelId;
private String friendlyName;
private int ttl = 3600;
private List<Policy> policies = Lists.newArrayList();
/**
* Create a new builder for a TaskRouter Capability.
*
* @param accountSid account to use
* @param authToken auth token for account
* @param workspaceSid workspace sid to use
* @param channelId channel ID to use
*/
public Builder(String accountSid, String authToken, String workspaceSid, String channelId) {
this.accountSid = accountSid;
this.authToken = authToken;
this.workspaceSid = workspaceSid;
this.channelId = channelId;
}
public Builder friendlyName(String friendlyName) {
this.friendlyName = friendlyName;
return this;
}
public Builder ttl(int ttl) {
this.ttl = ttl;
return this;
}
public Builder policies(List<Policy> policies) {
this.policies = policies;
return this;
}
public TaskRouterCapability build() {
return new TaskRouterCapability(this);
}
}
}