File size: 5,582 Bytes
2b879a3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
from flask import Flask, request, jsonify, make_response
from flasgger import Swagger, swag_from
from vaderSentiment.vaderSentiment import SentimentIntensityAnalyzer
import random
import csv

app = Flask(__name__)
swagger = Swagger(app)

# Définition du titre de la documentation Swagger
app.config['SWAGGER'] = {
    'title': 'API Analyse de sentiment',
    'description': 'Documentation de l\'API pour l\'analyse de sentiment',
    'version': '1.0.0'
}

# Charger les informations d'authentification à partir du fichier credentials.csv
def load_credentials(file_path):
    credentials = {}
    with open(file_path, newline='') as csvfile:
        reader = csv.DictReader(csvfile)
        for row in reader:
            credentials[row['username']] = {'password': row['password'], 'v1': int(row['v1']), 'v2': int(row['v2'])}
    return credentials

credentials = load_credentials('credentials.csv')

# Route pour vérifier l'état de l'API
@app.route('/status')
def status():
    """
    API Status
    ---
    responses:
      200:
        description: API is working
        examples:
          message: 1
    """
    return '1'

  

# Route pour saluer l'utilisateur
@app.route('/welcome')
def welcome():
    """
    Message de bienvenue
    ---
    parameters:
      - name: username
        in: query
        type: string
        required: true
        description: Message de bienvenue à l'utilisateur
    responses:
      200:
        description: Message
        examples:
        message: Bienvenue sur l'API d'Analyse de sentiment, Olivier!
    """
    username = request.args.get('username')
    return f"Bienvenue sur l'API d'Analyse de sentiment {username}!"



# Route pour vérifier les credentials de l'utilisateur
@app.route('/credentials', methods=['POST'])
def check_credentials():
    """
    credentials Route
    ---
    consumes:
      - application/json
    parameters:
      - in: header
        name: Authorization
        type: string
        required: true
        description: The user's credentials in the format "username=password"
    responses:
      200:
        description: A list of user credentials
        examples:
          username: John
          v1: 1
          v2: 0
    """
    auth = request.headers.get('Authorization')
    if not auth:
        return 'Unauthorized', 401

    username, password = auth.split('=')
    if username not in credentials or credentials[username]['password'] != password:
        return 'Unauthorized', 401

    response_data = {'username': username, 'v1': credentials[username]['v1'], 'v2': credentials[username]['v2']}
    response = make_response(jsonify(response_data), 200)
    response.headers['Content-Type'] = 'application/json'
    return response


# Route pour l'analyse de sentiment avec le modèle v1
@app.route('/v1/sentiment', methods=['POST'])
def sentiment_v1():
    """
    Sentiment Analysis Route (Model v1)
    ---
    parameters:
      - in: header
        name: Authorization
        type: string
        required: true
        description: The user's credentials in the format "username=password"
      - in: formData  # Modification ici pour spécifier le type de données du formulaire
        name: sentence
        type: string
        required: true
        description: The sentence to analyze
    responses:
      200:
        description: The sentiment score
        examples:
          score: 0.5
    """
    auth = request.headers.get('Authorization')
    if not auth:
      return 'Unauthorized', 401

    username, password = auth.split('=')
    if username not in credentials or credentials[username]['password'] != password:
      return 'Unauthorized (wrong username and/or password)', 401
    
    if credentials[username]['v1']==0:
      return 'User unauthorized for Sentiment Analysis v1', 401
    
    sentence = request.form.get('sentence')
    if not sentence:
      return 'Bad Request', 400

    # Implémentation factice de l'analyse de sentiment pour le modèle v1 (nombre aléatoire entre -1 et 1)
    sentiment_score = random.uniform(-1, 1)
    return str(sentiment_score)

# Route pour l'analyse de sentiment avec le modèle v2
@app.route('/v2/sentiment', methods=['POST'])
def sentiment_v2():
    """
    Sentiment Analysis Route (Model v2)
    ---
    parameters:
      - in: header
        name: Authorization
        type: string
        required: true
        description: The user's credentials in the format "username=password"
      - in: formData  # Modification ici pour spécifier le type de données du formulaire
        name: sentence
        type: string
        required: true
        description: The sentence to analyze
    responses:
      200:
        description: The sentiment score
        examples:
          score: 0.5
    """
    auth = request.headers.get('Authorization')
    if not auth:
      return 'Unauthorized', 401

    username, password = auth.split('=')
    if username not in credentials or credentials[username]['password'] != password:
      return 'Unauthorized (wrong username and/or password)', 401
    
    if credentials[username]['v2']==0:
      return 'User unauthorized for Sentiment Analysis v2', 401
    
    sentence = request.form.get('sentence')
    if not sentence:
      return 'Bad Request', 400

    # Implémentation de l'analyse de sentiment avec le modèle v2 (VaderSentiment)
    analyzer = SentimentIntensityAnalyzer()
    sentiment_score = analyzer.polarity_scores(sentence)['compound']
    return str(sentiment_score)

if __name__ == '__main__':
    app.run(host="0.0.0.0",debug=True)